Есть ли простой способ сделать вложенный массив плоским?

Чтобы сделать это:

[ ['dog','cat', ['chicken', 'bear'] ],['mouse','horse'] ]

в:

['dog','cat','chicken','bear','mouse','horse']

Ответ 1

var flattened = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
  return a.concat(b);
});
// flattened is [0, 1, 2, 3, 4, 5]

Заметьте, что сокращение не поддерживается в IE 8 и ниже.

ссылка на developer.mozilla.org

Ответ 2

В современных браузерах вы можете сделать это без каких-либо внешних библиотек в нескольких строках:

Array.prototype.flatten = function() {
  return this.reduce(function(prev, cur) {
    var more = [].concat(cur).some(Array.isArray);
    return prev.concat(more ? cur.flatten() : cur);
  },[]);
};

console.log([['dog','cat',['chicken', 'bear']],['mouse','horse']].flatten());
//^ ["dog", "cat", "chicken", "bear", "mouse", "horse"]

Ответ 3

Возьмите underscore.js и используйте flatten.

_.flatten([ ['dog','cat', ['chicken', 'bear'] ],['mouse','horse'] ]);

Ответ 4

Как насчет этого одного кода liner?

[ ['dog','cat', ['chicken', 'bear'] ],[['mouse','horse'],'lion'] ].join().split(',')

в основном join будет разделять запятую строку из вложенного массива, и с помощью split вы можете получить 1d-массив, хорошо? бонус он будет работать и на всех основных браузерах:)

поэтому вывод будет: -

["dog", "cat", "chicken", "bear", "mouse", "horse", "lion"]

Ответ 5

Небольшое исправление для решения ChewOnThis_Trident, и оно отлично работает:

Array.prototype.flatten = function() {
    return this.reduce(function(a, b) {
        return a.concat(b);
    }, []);
};

Ответ 6

Предполагая массив, который уже распакован из JSON, попробуйте следующее:

Array.prototype.flatten = function() {
    var r = [];
    for (var i = 0; i < this.length; ++i) {
        var v = this[i];
        if (v instanceof Array) {
            Array.prototype.push.apply(this, v.flatten());
        } else {
            r.push(v);
        }
    }
    return r;
};

Кажется, что он корректно работает на вашем входе - см. http://jsfiddle.net/alnitak/Ws7L5/

Ответ 7

Я знаю, что это поздно, но я также столкнулся с ситуацией, когда мне нужно было сделать многомерный массив в 1 массив, и я сделал следующую функцию.

function nested(arr) {
    var noNest = arr.toString().split(',').filter(Boolean),
        i = 0;

    for(i;i<noNest.length; i++){
        if(isNaN(noNest[i])){
            return console.log(noNest);
        } else {
            noNest[i] = parseInt(noNest[i]);
        }
    }
    return console.log(noNest);
}

nested([[['a']], [['b']]]);

Это также принимает вложенные массивы внутри тестируемого массива и гарантирует, что его один массив в качестве окончательного размещения помещает

Ответ 8

Это решение отлично работает для меня, и я считаю его особенно удобным:

function flattenArray(arr) {
  // the new flattened array
  var newArr = [];

  // recursive function
  function flatten(arr, newArr) {
    // go through array
    for (var i = 0; i < arr.length; i++) {
      // if element i of the current array is a non-array value push it
      if (Array.isArray(arr[i]) === false) {
        newArr.push(arr[i]);
      }
      // else the element is an array, so unwrap it
      else {
        flatten(arr[i], newArr);
      }
    }
  }

  flatten(arr, newArr);

  return newArr;
}

Ответ 9

Вот почему я люблю javascript:

function flattenArray(source) {
  return source.toString().split(',');
}

flattenArray([['dog', 'cat', ['chicken', 'bear']], ['mouse', 'horse']]);
// -> ['dog','cat','chicken','bear','mouse','horse']

Ответ 10

Один подход, который вы могли бы предпринять, - использовать библиотеку JSON2:

  • JSON.stringify массив
  • Разделите все, кроме первого и последнего [ и ] (или разделите их все), и добавьте их в начало и конец.
  • JSON.parse он возвращается к массиву JavaScript

Я предполагаю, что, конечно, вы начинаете с массива JavaScript. Если его строка, то шаги 1 и 3 не имеют значения.

Ответ 11

Вы также можете использовать этот массив-flatMap компонент с открытым исходным кодом.

Пример:

flatMap([[1, 2, 3], [4, 5, 6]], val => val) // => [1, 2, 3, 4, 5, 6]

Один из его тестов показывает этот пример, относящийся к этому случаю:

flatMap() should flatten the multi-dimensional array to a single-dimensional one

Ответ 12

ES6 способ сделать это будет

[['a', 'b'], ['c', 'd']].reduce((x,v) => [...x, ...v], [])