javascript:尝试仅将数组展平一层
Posted
技术标签:
【中文标题】javascript:尝试仅将数组展平一层【英文标题】:javascript: Trying to flatten array only one level 【发布时间】:2013-02-12 11:52:15 【问题描述】:我正在尝试编写一个函数来展平数组。我有一部分功能正在工作,而另一半我需要帮助。
flatten: function(anyArray, singleLevel)
if (singleLevel == true)
flatArray = Array.prototype.concat.apply([], anyArray);
return flatArray;
flatArray = Array.prototype.concat.apply([], anyArray);
if (flatArray.length != anyArray.length)
flatArray = someObject.array.flatten(flatArray);
return flatArray;
如果我输入
.flatten([[[1],[1,2,3,[4,5],4],[2,3]]], true);
我希望它只展平一层:
[[1],[1,2,3,[4,5],4],[2,3]]
【问题讨论】:
我不认为多级平面对于[[[[[1]]]]]
等数组的预期效果并不理想
【参考方案1】:
现代 javascript 让我们可以使用多种技术轻松处理此问题
使用Array.prototype.flat
-
const arr =
[ [ 1 ], [ 2, 3, [ 4, 5, [ 6 ] ] ], [ 7, [ 8, 9 ] ] ]
const flatArr =
arr.flat(1) // 1 is default depth
console.log(JSON.stringify(arr))
console.log(JSON.stringify(flatArr))
// [[1],[2,3,[4,5,[6]]],[7,[8,9]]]
// [1,2,3,[4,5,[6]],7,[8,9]]
使用Array.prototype.flatMap
-
const arr =
[ [ 1 ], [ 2, 3, [ 4, 5, [ 6 ] ] ], [ 7, [ 8, 9 ] ] ]
const flatArr =
arr.flatMap(x => x)
console.log(JSON.stringify(arr))
console.log(JSON.stringify(flatArr))
// [[1],[2,3,[4,5,[6]]],[7,[8,9]]]
// [1,2,3,[4,5,[6]],7,[8,9]]
对Array.prototype.concat
使用扩展参数
const arr =
[ [ 1 ], [ 2, 3, [ 4, 5, [ 6 ] ] ], [ 7, [ 8, 9 ] ] ]
const flatArr =
[].concat(...arr)
console.log(JSON.stringify(arr))
console.log(JSON.stringify(flatArr))
// [[1],[2,3,[4,5,[6]]],[7,[8,9]]]
// [1,2,3,[4,5,[6]],7,[8,9]]
旧版本的 JavaScript(ECMAScript 5 及更低版本)可以使用 Function.prototype.apply
等技术 -
var arr =
[ [ 1 ], [ 2, 3, [ 4, 5, [ 6 ] ] ], [ 7, [ 8, 9 ] ] ]
var flatArr =
Array.prototype.concat.apply([], arr)
console.log(JSON.stringify(arr))
console.log(JSON.stringify(flatArr))
// [[1],[2,3,[4,5,[6]]],[7,[8,9]]]
// [1,2,3,[4,5,[6]],7,[8,9]]
使用Array.prototype.reduce
-
var arr =
[ [ 1 ], [ 2, 3, [ 4, 5, [ 6 ] ] ], [ 7, [ 8, 9 ] ] ]
var flatArr =
arr.reduce((r, a) => r.concat(a), [])
console.log(JSON.stringify(arr))
console.log(JSON.stringify(flatArr))
// [[1],[2,3,[4,5,[6]]],[7,[8,9]]]
// [1,2,3,[4,5,[6]],7,[8,9]]
使用原始 for
循环 -
var arr =
[ [ 1 ], [ 2, 3, [ 4, 5, [ 6 ] ] ], [ 7, [ 8, 9 ] ] ]
var flatArr =
[]
for (var i = 0; i < arr.length; i = i + 1)
flatArr = flatArr.concat(arr[i])
console.log(JSON.stringify(arr))
console.log(JSON.stringify(flatArr))
// [[1],[2,3,[4,5,[6]]],[7,[8,9]]]
// [1,2,3,[4,5,[6]],7,[8,9]]
【讨论】:
【参考方案2】:concat
array method 需要一个或多个数组作为参数,其元素将被附加:
[1].concat([2, 3], [4]) // [1, 2, 3, 4]
因此,如果您使用apply
,那将变平另一个级别:
[].concat.apply([1], [[2], [3]]) // === [1].concat([2], [3])
因此,您可以使用push
代替concat
,或使用call
(或直接调用)代替apply
,只获得一个扁平化级别。
【讨论】:
【参考方案3】:如果你使用 ES6/ES2015,你可以使用 spread 操作符。像这样的
console.log(...[[[1],[1,2,3,[4,5],4],[2,3]]])
【讨论】:
以上是关于javascript:尝试仅将数组展平一层的主要内容,如果未能解决你的问题,请参考以下文章