为了账号安全,请及时绑定邮箱和手机立即绑定

如何折叠多维数组

如何折叠多维数组

qq_遁去的一_1 2021-11-18 09:37:21
怎么做?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”的方法。
查看完整描述

2 回答

?
SMILET

TA贡献1796条经验 获得超4个赞

该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]));


查看完整回答
反对 回复 2021-11-18
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

一种简单的递归方法是调用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),并得到一个数组回来。


查看完整回答
反对 回复 2021-11-18
  • 2 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信