Comment simplement aplatir un tableau dans jQuery? J'ai:Comment aplatir un tableau dans jQuery?
[1, 2, [3, 4], [5, 6], 7]
Et je veux:
[1, 2, 3, 4, 5, 6, 7]
Comment simplement aplatir un tableau dans jQuery? J'ai:Comment aplatir un tableau dans jQuery?
[1, 2, [3, 4], [5, 6], 7]
Et je veux:
[1, 2, 3, 4, 5, 6, 7]
Vous pouvez utiliser jQuery.map, qui est la voie à suivre si vous avez la bibliothèque jQuery déjà chargée.
$.map([1, 2, [3, 4], [5, 6], 7], function(n){
return n;
});
Retours
[1, 2, 3, 4, 5, 6, 7]
Vous pouvez utiliser jQuery.map()
:
rappel (valeur, indexOrKey) La fonction de traiter chaque élément contre. Le premier argument de la fonction est la valeur; le deuxième argument est l'index ou la clé de la propriété array ou object. La fonction peut renvoyer n'importe quelle valeur à ajouter au tableau. Un tableau retourné sera aplati dans le tableau résultant. Dans la fonction, ce fait référence à l'objet global (fenêtre).
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 fonction Aplatir devrait le faire, et cela ne nécessite pas jQuery. Copiez tout cela dans Firebug et lancez-le.
Je devrais ajouter que cela va aplatir non seulement les tableaux, mais tout ce qui a une méthode de "longueur". Il n'est pas vraiment possible d'être sûr en Javascript que quelque chose est un vrai tableau sauf s'il a été déclaré comme nouveau tableau(). – dnuttle
dnuttle: En fait, je pense que l'utilisation de 'obj instanceof Array' est à peu près autorisée à fonctionner. (Sauf s'il y a une autre variable nommée Array, alors vous pouvez utiliser 'obj instanceof [] .constructor') –
Hmm. Tu as raison. J'aurais juré que j'avais déjà essayé ça et ça n'a pas marché. – dnuttle
Utilisez la puissance de JavaScript:
var a = [[1, 2], 3, [4, 5]];
console.log(Array.prototype.concat.apply([], a));
//will output [1, 2, 3, 4, 5]
Cela fonctionne si vous avez seulement des tableaux imbriqués profonds d'un niveau.Si vous avez un tableau dans un tableau dans un tableau, il ne sera pas aplati – dnuttle
@dnuttle Bien sûr, mais cette condition n'a pas été indiquée dans la question – bjornd
-1 pas assez jQuery (blague) – JiminP
Voici comment vous pouvez utiliser jquery pour aplatir tableaux profondément imbriqués:
$.map([1, 2, [3, 4], [5, [6, [7, 8]]]], function recurs(n) {
return ($.isArray(n) ? $.map(n, recurs): n);
});
Retours:
[1, 2, 3, 4, 5, 6, 7, 8]
profite de jQuery.map comme ainsi que jQuery.isArray.
question Vieux, je sais, mais ...
Je trouve cela fonctionne, et est rapide:
function flatten (arr) {
b = Array.prototype.concat.apply([], arr);
if (b.length != arr.length) {
b = flatten(b);
};
return b;
}
Mieux ajouter un 'var' au code' b = .... 'pour éviter un extra global. –
Pour plaquer récursive un tableau, vous pouvez utiliser la fonction Array.reduce native. Il n'est pas nécessaire d'utiliser jQuery pour cela.
function flatten(arr) {
return arr.reduce(function flatten(res, a) {
Array.isArray(a) ? a.reduce(flatten, res) : res.push(a);
return res;
}, []);
}
exécution
flatten([1, 2, [3, 4, [5, 6]]])
retours
[ 1, 2, 3, 4, 5, 6 ]
Bon à noter que cela fonctionne, mais pour les navigateurs modernes seulement (à moins d'être calé) –
Utilisez récursion si vous avez plusieurs niveaux:
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);
Vous pouvez utiliser Array.prototype.reduce
qui est techniquement j Requête, mais valide ES5:
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);
Accordé, c'est la façon dont il a été formulé dans la question, mais cela n'aplanit qu'un niveau. – phil