如何折叠多维数组

怎么做?


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”的方法。


qq_遁去的一_1
浏览 147回答 2
2回答

SMILET

该Array.prototype.flat()方法将起作用,只要您为其提供参数 ofInfinity以确保多维数组的所有级别都被展平:console.log([1, [10, 30, 40, [34, 53], 4], 2].flat(Infinity))作为替代方案,链接的文档建议使用递归flatDeep方法,该方法使用reduce并concat实现所需的行为: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]));

胡子哥哥

一种简单的递归方法是调用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),并得到一个数组回来。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript