2011-10-24 10 views

risposta

53

È possibile utilizzare jQuery.map, che è la strada da percorrere se avete la libreria jQuery già caricato.

$.map([1, 2, [3, 4], [5, 6], 7], function(n){ 
    return n; 
}); 

Returns

[1, 2, 3, 4, 5, 6, 7] 
+5

Concesso, questo è il modo in cui è stato formulato nella domanda, ma anche questo appiattirà un livello solo. – phil

4

È possibile utilizzare jQuery.map():

callback (valore, indexOrKey) La funzione per elaborare ogni oggetto contro. Il primo argomento della funzione è il valore; il secondo argomento è l'indice o la chiave dell'array o della proprietà dell'oggetto. La funzione può restituire qualsiasi valore da aggiungere all'array. Un array restituito verrà convertito nell'array risultante. All'interno della funzione, questo fa riferimento all'oggetto globale (finestra).

11
var a = [1, 2, [3, 4], [5, [6, [7, 8]]]]; 
var b = []; 

function flatten(e,b){ 
    if(typeof e.length != "undefined") 
    { 
     for (var i=0;i<e.length;i++) 
     { 
      flatten(e[i],b); 
     } 
    } 
    else 
    { 
     b.push(e); 
    } 
} 
flatten(a,b); 
console.log(b); 

La funzione Appiattisci dovrebbe farlo, e questo non richiede jQuery. Basta copiare tutto questo in Firebug ed eseguirlo.

+0

Dovrei aggiungere che questo appiattirà non solo gli array, ma tutto ciò che ha un metodo di "lunghezza". Non è davvero possibile essere sicuri in Javascript che qualcosa sia un vero array a meno che non sia stato dichiarato come nuovo Array(). – dnuttle

+0

dnuttle: In realtà, penso che l'uso di 'obj instanceof Array' sia praticamente concesso per funzionare. (A meno che non ci sia un'altra variabile denominata Array, allora puoi usare 'obj instanceof [] .constructor') –

+0

Hmm. Hai ragione. Avrei giurato di averlo provato prima e non ha funzionato. – dnuttle

33

utilizzare la potenza di JavaScript:

var a = [[1, 2], 3, [4, 5]]; 

console.log(Array.prototype.concat.apply([], a)); 
//will output [1, 2, 3, 4, 5] 
+3

Funziona se hai solo array nidificati a un livello di profondità. in un array, non sarà appiattito – dnuttle

+1

@dnuttle Certo, ma questa condizione non è stata indicata nella domanda – bjornd

+28

-1 non sufficiente jQuery (scherzo) – JiminP

20

Ecco come è possibile utilizzare jQuery per appiattire le matrici profondamente nidificate:

$.map([1, 2, [3, 4], [5, [6, [7, 8]]]], function recurs(n) { 
    return ($.isArray(n) ? $.map(n, recurs): n); 
}); 

Ritorni:

[1, 2, 3, 4, 5, 6, 7, 8] 

sfrutta jQuery.map come bene come jQuery.isArray.

0

vecchia questione, lo so, ma ...

Ho trovato questo funziona, ed è veloce:

function flatten (arr) { 
    b = Array.prototype.concat.apply([], arr); 
    if (b.length != arr.length) { 
    b = flatten(b); 
    }; 

    return b; 
} 
+2

Meglio aggiungere un 'var' al codice' b = .... 'per evitare un extra globale. –

5

per appiattire in modo ricorsivo una matrice è possibile utilizzare la funzione nativa Array.reduce. Non è necessario usare jQuery per quello.

function flatten(arr) { 
    return arr.reduce(function flatten(res, a) { 
     Array.isArray(a) ? a.reduce(flatten, res) : res.push(a); 
     return res; 
    }, []); 
} 

Esecuzione

flatten([1, 2, [3, 4, [5, 6]]]) 

rendimenti

[ 1, 2, 3, 4, 5, 6 ] 
+0

Buono a notare che funziona, ma solo per i browser moderni (a meno che non siano ingranditi) –

0

Usa ricorsione se si dispone di più livelli:

flaten = function(flatened, arr) { 
    for(var i=0;i<arr.length;i++) { 
     if (typeof arr[i]!="object") { 
      flatened.push(arr[i]); 
     } 
     else { 
      flaten(flatened,arr[i]); 
     } 
    } 
    return; 
} 

a=[1,[4,2],[2,7,[6,4]],3]; 
b=[]; 
flaten(b,a); 
console.log(b); 
1

È possibile utilizzare Array.prototype.reduce che non è tecnicamente j Query, ma ES5 valido:

var multidimensionArray = [1, 2, [3, 4], [5, 6], 7]; 
var initialValue = []; 

var flattened = multidimensionArray.reduce(function(accumulator, current) { 
    return accumulator.concat(current); 
}, initialValue); 

console.log(flattened); 
Problemi correlati