是否有一种简单的方法可以使嵌套数组变平?

时间:2011-05-17 15:04:32

标签: javascript arrays

这是为了做到这一点:

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

进入:

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

13 个答案:

答案 0 :(得分:24)

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及更低版本不支持reduce。

developer.mozilla.org reference

答案 1 :(得分:23)

在现代浏览器中,您可以在没有任何外部库的情况下执行此操作:

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"]

答案 2 :(得分:10)

抓取underscore.js并使用flatten功能。

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

答案 3 :(得分:7)

这个班轮代码怎么样?



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




基本上连接会从嵌套数组中使用逗号分隔字符串并使用拆分你可以得到1d数组,好吗? 奖励它也适用于所有主流浏览器:)

答案 4 :(得分:5)

ChewOnThis_Trident解决方案的小修复,它完美无缺:

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

答案 5 :(得分:4)

假设一个已经从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/

答案 6 :(得分:1)

我知道这已经晚了但是我也遇到了一个需要将多维数组制作成一个数组的情况,我按照以下方式编写了一个函数。

{{1}}

这也将测试数组中的嵌套数组作为最终输出

答案 7 :(得分:1)

此解决方案对我来说非常有用,我发现它特别容易理解:

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

答案 8 :(得分:1)

这就是我喜欢javascript的原因:

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

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

答案 9 :(得分:1)

现在是2019年 ,您可以方便地以任意深度使用Array.flat

let arr  = [ ['dog','cat', ['chicken', 'bear'] ],['mouse','horse'] ]

let op = arr.flat(Infinity)

console.log(op)

现在,如果要获取唯一值,可以将Set和flat组合在一起

let arr  = [ ['dog','cat', ['chicken', 'bear', 'cat'] ],['mouse','horse', 'dog'], [[[['deeper','chicken']]]] ]

let unique  = [...new Set(arr.flat(Infinity))]

console.log(unique)
Browser comparability除了IE以外,其他所有似乎都支持IE的人都可以使用polyfill。

答案 10 :(得分:0)

您可以采用的方法是使用JSON2库:

  1. JSON.stringify数组
  2. 删除除第一个和最后一个[]以外的所有内容(或删除所有内容并将其中的开头和结尾添加回来)。
  3. JSON.parse它返回JavaScript数组
  4. 我假设你当然没有使用JavaScript数组。如果是字符串,则步骤1和3无关紧要。

答案 11 :(得分:0)

ES6的实现方式是

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

答案 12 :(得分:0)

平整任何深度的对象的最简单方法是使用flat方法

var arr = [['dog','cat', ['chicken', 'bear']],[['mouse','horse'],'lion'] ]; 
var flattened = arr.flat(Infinity);
//output--> ["dog", "cat", "chicken", "bear", "mouse", "horse", "lion"]

More aout Flat()