【问题标题】:Flatten a jagged multi dimensional array展平锯齿状多维数组
【发布时间】:2016-07-31 17:16:00
【问题描述】:

我需要像这样扁平化数组的帮助:

[1,2,[2,3],[5,[6,1],4],7]

我希望它像

[1,2,2,3,5,6,1,4,7].

我搜索过类似的东西,找到了[].concat.apply,但它只会处理二维数组。

我还想使用一种适用于任何锯齿状多维数组的算法。请帮忙。谢谢

【问题讨论】:

  • 您可能想告诉我们您使用的是什么编程语言。
  • 我的意思是javascript

标签: javascript multidimensional-array


【解决方案1】:

我的建议是依赖lodash 并使用flattenDeep 函数。

_.flattenDeep([1,2,[2,3],[5,[6,1],4],7])
// [ 1, 2, 2, 3, 5, 6, 1, 4, 7 ]

如果你想编写自己的函数,你可能想看看 lodash 的实现。

在伪代码中,这是一种递归方法:

result = []
function flatten(array)
  for each element in array
    if element is array
      flatten(element)
    else
      result.append(element)

编辑

这是一种“手动”方法,但我绝对建议使用经过更好测试的 lodash 实现。

function flatten(arr, result) {
  if (result === undefined) {
    result = [];
  }

  for (var i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      flatten(arr[i], result);
    } else {
      result.push(arr[i]);
    }
  }

  return result;
}

console.log(flatten([1, 2, [2, 3], [5, [6, 1], 4], 7]));

// Output:
// [ 1, 2, 2, 3, 5, 6, 1, 4, 7 ]

【讨论】:

  • 谢谢,但这个问题与网站上的问题有关。我只能用 vanilla javascript 解决它
  • @nova_n 为什么你不能使用 lodash?
  • 只需将 &lt;script src="https://cdn.jsdelivr.net/lodash/4.14.1/lodash.min.js"&gt;&lt;/script&gt; 添加到 HTML 的 &lt;head&gt; 部分即可。
  • 本网站只允许使用 vanila javascript 进行培训。
  • 感谢手动解决方案
【解决方案2】:

您可以将concat.apply 包裹在一个循环中以处理深度嵌套的数组:

while (a.some(Array.isArray))
    a = [].concat.apply([], a)

或者在 ES6 语法中:

while (a.some(Array.isArray)) 
    a = [].concat(...a);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 2013-02-24
    • 2015-12-11
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 2018-07-26
    相关资源
    最近更新 更多