【问题标题】:How to collapse multidimensional array如何折叠多维数组
【发布时间】:2020-02-09 07:28:53
【问题描述】:

怎么做?

unpack_array([1, [10, 30, 40,[34,53],4],2]) -> [1,10,30,40,34,53,4,2]

我知道必须应用递归。我试过了,但结果只在一个方向上起作用。

function unpack_array (arr, acc_arr=[]) {
  if (!arr) return acc_arr;
  let i = 0;
  while (arr[i] && !Array.isArray(arr[i])) {
    acc_arr.push(arr[i++])
  }
  return unpack_array(arr[i], acc_arr)
}

相信这里需要用到“reduce”的方法。

【问题讨论】:

标签: javascript recursion multidimensional-array


【解决方案1】:

Array.prototype.flat() 方法将起作用,只要您为其提供参数 Infinity 以确保多维数组的所有级别都被展平:

console.log([1, [10, 30, 40, [34, 53], 4], 2].flat(Infinity))

作为替代方案,链接文档建议使用递归 flatDeep 方法,该方法使用 reduceconcat 来实现所需的行为:

function flatDeep(arr) {
   return arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? flatDeep(val) : val), []);
};

console.log(flatDeep([1, [10, 30, 40, [34, 53], 4], 2]));

【讨论】:

  • 还有arr4.flat(Infinity); ;)
【解决方案2】:

一种简单的递归方法是只调用Array#reduce 并使用Array#concat 将每个项目组合成一个结果,但也递归调用该项目上的unpack_array。这样您就可以处理任何深度的嵌套数组:

function unpack_array(arr) {
  if (!Array.isArray(arr)) return [arr];
  
  return arr.reduce((acc, item) => acc.concat(unpack_array(item)), [])
}

console.log(unpack_array([1, [10, 30, 40,[34,53],4],2]))// -> [1,10,30,40,34,53,4,2]

递归的终止条件是如果你到达一个不是数组的项目。在这种情况下,您不必执行return [arr],一个简单的return arr 也可以,但这种方式更加一致 - 您可以调用unpack_array(7) 并取回一个数组。

【讨论】:

  • 回到过去,我们是这样做的:while(a.some(Array.isArray)) a=[].concat.apply([], a)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-20
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-13
相关资源
最近更新 更多