Как сгладить массив в jQuery? - PullRequest
51 голосов
/ 24 октября 2011

Как просто сгладить массив в jQuery? У меня есть:

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

И я хочу:

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

Ответы [ 10 ]

58 голосов
/ 24 октября 2011

Вы можете использовать jQuery.map , это путь, если у вас уже есть библиотека jQuery.

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

Возвращает

[1, 2, 3, 4, 5, 6, 7]
35 голосов
/ 24 октября 2011

Используйте силу JavaScript:

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

console.log( Array.prototype.concat.apply([], a) );
//will output [1, 2, 3, 4, 5]
25 голосов
/ 08 октября 2012

Вот как вы можете использовать jquery для выравнивания глубоко вложенных массивов:

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

Возвращает:

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

Использует преимущества jQuery.map , а также jQuery.isArray .

11 голосов
/ 24 октября 2011
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);

Функция flatten должна это делать, и для этого не требуется jQuery. Просто скопируйте все это в Firebug и запустите.

5 голосов
/ 04 мая 2013

Для рекурсивного выравнивания массива вы можете использовать встроенную функцию Array.reduce . Для этого не нужно использовать jQuery.

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

Выполнение

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

возвращает

[ 1, 2, 3, 4, 5, 6 ]
4 голосов
/ 24 октября 2011

Вы можете использовать jQuery.map():

callback (value, indexOrKey) Функция для обработки каждого элемента.Первый аргумент функции - это значение;второй аргумент - это индекс или ключ массива или свойства объекта.Функция может возвращать любое значение для добавления в массив. Возвращенный массив будет сведен в результирующий массив .Внутри функции это относится к глобальному (оконному) объекту.

1 голос
/ 22 февраля 2015

Вы можете использовать Array.prototype.reduce, который технически не является jQuery, но действительным 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);
1 голос
/ 16 октября 2014

Используйте рекурсию, если у вас есть несколько уровней:

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);
0 голосов
/ 06 июля 2019

Вам нужно 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 голосов
/ 28 ноября 2012

Старый вопрос, я знаю, но ...

Я нашел это работает, и быстро:

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

  return b;
}
...