【问题标题】:javascript: Trying to flatten array only one leveljavascript:尝试仅将数组展平一层
【发布时间】: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]]]]] 等数组的预期效果并不理想

标签: javascript flatten


【解决方案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]]])

      【讨论】:

        猜你喜欢
        • 2018-10-08
        • 1970-01-01
        • 1970-01-01
        • 2019-11-24
        • 2020-01-26
        • 2013-03-07
        • 2023-03-26
        • 2021-11-05
        • 2016-06-20
        相关资源
        最近更新 更多