2011-05-17 104 views
8

那就是让这样的:有没有简单的方法来使嵌套数组平坦?

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

到:

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

+2

*您可以*简单地替换所有'['和']'一个空字符串然后添加前导和结束括号。 – pimvdb 2011-05-17 15:07:40

+3

这不是JSON。 – Quentin 2011-05-17 15:10:46

+1

那么正确调用的东西是什么,一个对象,一个数组? – rsk82 2011-05-17 15:14:58

回答

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

这注值得减少ISN在IE 8及更低版本中支持。

developer.mozilla.org reference

+2

这不符合OP的要求。它产生[“狗”,“猫”,[“鸡”,“熊”],“鼠标”,“马”]离开内部阵列作为一个数组,而不是扁平化其元素。 – 2013-07-22 22:10:08

+0

的确如此,我只是想到了他需要的概念,而且看起来他从那里得到了它。 – 2013-07-22 22:46:40

0

一个你可以采取会的方式,使用JSON2库:

  1. JSON.stringify数组
  2. Stri除了第一个和最后一个[](或剥去所有这些字符并将开始和结束字符添加回来)。
  3. JSON.parse回JavaScript数组

我假设,当然,你AREN开始JavaScript数组。如果它是一个字符串,那么步骤1和3是不相关的。

+0

JSON.stringify内部循环遍历数组,所以在这个方法中你会遍历所有的两次..所以你可能只想自己做递归,并将所有遇到的“数字”推送到一个新的数组,并返回一个 – vsync 2011-07-02 15:06:27

+0

大声笑... + 1的创意....只是要小心,不要从内部引用的值中删除任何方括号!这是一个疯狂的想法,但它可以工作。 (实际上,只需使用lodash.flatten) – 2016-05-05 14:27:43

9

抓取underscore.js并使用flatten函数。

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

这应该是被接受的答案。不需要重新发明轮子:) – 2016-02-25 12:56:23

+0

有些人不希望为一种功能加载新脚本! – Rachmaninoff 2017-01-22 10:15:32

+0

然后抓住下划线,看他们的扁平功能是如何工作的,并写下你自己的,而不是在这里抱怨。 – 2017-01-23 17:53:04

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/

+0

这不一定是真的,看看http://jsfiddle.net/theycallmeswift/qfpGK/1/ – Swift 2011-05-17 15:21:00

+0

是的,警报正在变平。 console.log()显示正确的结果。 – Alnitak 2011-05-17 15:25:23

+0

p.s. downvote对于实际工作但由于意外的alert()行为而没有正确显示结果的代码很严重 – Alnitak 2011-05-17 15:29:59

20

在现代浏览器中,你可以做到这一点没有几行任何外部库:

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

这应该是被接受的答案 – SwankSwashbucklers 2015-05-14 17:04:53

4

小修为ChewOnThis_Trident解决方案,它完美的作品:

Array.prototype.flatten = function() { 
    return this.reduce(function(a, b) { 
     return a.concat(b); 
    }, []); 
}; 
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']]]); 

这也采取了测试阵列内嵌套的数组,使作为最后出来把

+0

我不需要在其上有过滤器,但现在它会自动将字符串的数字转换为整数,但这很容易编辑。我敢肯定有人会发现这个有用的,并不像我必须 – TrojanMorse 2015-04-30 18:34:09

5

这个怎么样衬代码确定它一个数组?

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

基本上连接将使逗号分隔字符串从嵌套数组和使用拆分你可以得到1D数组,好吗?奖金它会在所有主流浏览器以及工作:)

所以输出将是: -

["dog", "cat", "chicken", "bear", "mouse", "horse", "lion"] 
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; 
} 
1

这就是为什么我爱的javascript:

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

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

这样的圈子运行这很酷,当数组很小,并且单词没有“,”里面,一旦它增长,性能可能是一个问题。 – calbertts 2017-06-28 08:24:21

0

您也可以使用这个array-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 
相关问题