web-dev-qa-db-fra.com

Comment aplatir le tableau dans jQuery?

Comment simplement aplatir le tableau dans jQuery? J'ai:

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

Et je veux:

[1, 2, 3, 4, 5, 6, 7]
53
extern.fx

Vous pouvez utiliser jQuery.map , qui est la voie à suivre si vous avez déjà chargé la bibliothèque jQuery.

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

Retour

[1, 2, 3, 4, 5, 6, 7]
58
MarioRicalde

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]
35
bjornd

Voici comment utiliser jquery pour aplatir des tableaux profondément imbriqués:

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

Retour:

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

Profite de jQuery.map ainsi que jQuery.isArray .

25
Xavi
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 d'aplatissement devrait le faire, et cela ne nécessite pas jQuery. Copiez simplement tout cela dans Firebug et lancez-le.

11
dnuttle

Pour aplatir récursivement un tableau, vous pouvez utiliser la fonction native Array.reduce . 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]]])

retour

[ 1, 2, 3, 4, 5, 6 ]
5
Fabian Jakobs

Vous pouvez utiliser jQuery.map() :

callback (value, indexOrKey) La fonction pour laquelle chaque élément est traité. Le premier argument de la fonction est la valeur; le deuxième argument est l'index ou la clé du tableau ou de la propriété d'objet. La fonction peut renvoyer n'importe quelle valeur à ajouter au tableau. Un tableau retourné sera aplati dans le tableau résultant . Dans la fonction, cela fait référence à l'objet global (fenêtre).

4
Sarfraz

Vous pouvez utiliser Array.prototype.reduce qui n'est pas techniquement jQuery, mais ES5 valide:

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

Utilisez la récursivité 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
Udai Arora

Vieille question, je sais, mais ...

J'ai trouvé que ça marche, et c'est rapide:

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

  return b;
}
0
phil

Vous avez besoin de arr.flat([depth])

var arr1 = [1, 2, [3, 4]];
arr1.flat(); 
// [1, 2, 3, 4]

var arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]

var arr3 = [1, 2, [3, 4, [5, 6]]];
arr3.flat(2);
// [1, 2, 3, 4, 5, 6]
0
Eugen Konkov