Come appiattire semplicemente array in jQuery? Ho:Come appiattire l'array in jQuery?
[1, 2, [3, 4], [5, 6], 7]
E voglio:
[1, 2, 3, 4, 5, 6, 7]
Come appiattire semplicemente array in jQuery? Ho:Come appiattire l'array in jQuery?
[1, 2, [3, 4], [5, 6], 7]
E voglio:
[1, 2, 3, 4, 5, 6, 7]
È 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]
È 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).
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.
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
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') –
Hmm. Hai ragione. Avrei giurato di averlo provato prima e non ha funzionato. – dnuttle
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]
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.
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;
}
Meglio aggiungere un 'var' al codice' b = .... 'per evitare un extra globale. –
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 ]
Buono a notare che funziona, ma solo per i browser moderni (a meno che non siano ingranditi) –
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);
È 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);
Concesso, questo è il modo in cui è stato formulato nella domanda, ma anche questo appiattirà un livello solo. – phil