10

我正在尝试编写一个函数来展平数组。我有一部分功能正在工作,而另一半我需要帮助。

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

3 回答 3

9

现代 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]]

于 2019-05-28T14:03:39.947 回答
5

concatarray 方法需要一个或多个数组作为参数,其元素将被附加:

[1].concat([2, 3], [4]) // [1, 2, 3, 4]

因此,如果您使用apply,那将变平另一个级别:

[].concat.apply([1], [[2], [3]]) // === [1].concat([2], [3])

因此,您可以使用push而不是concat,或call(或直接调用)而不是apply仅获得一个展平级别。

于 2013-02-26T21:23:06.637 回答
-1

如果你使用 ES6/ES2015,你可以使用扩展运算符。像这样的东西

console.log(...[[[1],[1,2,3,[4,5],4],[2,3]]])

于 2017-03-25T12:48:59.147 回答