2011-10-24 3 views

Répondre

53

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] 
+5

Accordé, c'est la façon dont il a été formulé dans la question, mais cela n'aplanit qu'un niveau. – phil

4

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).

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 fonction Aplatir devrait le faire, et cela ne nécessite pas jQuery. Copiez tout cela dans Firebug et lancez-le.

+0

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

+0

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') –

+0

Hmm. Tu as raison. J'aurais juré que j'avais déjà essayé ça et ça n'a pas marché. – dnuttle

33

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] 
+3

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

+1

@dnuttle Bien sûr, mais cette condition n'a pas été indiquée dans la question – bjornd

+28

-1 pas assez jQuery (blague) – JiminP

20

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.

0

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; 
} 
+2

Mieux ajouter un 'var' au code' b = .... 'pour éviter un extra global. –

5

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 ] 
+0

Bon à noter que cela fonctionne, mais pour les navigateurs modernes seulement (à moins d'être calé) –

0

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); 
1

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); 
Questions connexes