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:尝试仅将数组展平一层的主要内容,如果未能解决你的问题,请参考以下文章

仅将 java 类实例转换为原始类型

在javascript中展平数组[重复]

展平 javascript 对象数组

递归地展平数组(不循环)javascript

Javascript:使用递归将多维数组展平到位

如何在javascript中展平嵌套数组? [复制]