关于flatten使用递归的概念与减少和concat

问题描述 投票:2回答:1

现在我想用多个图层展平数组

从之前的其他解决方案和开发人员的网络,有一个有效的解决方案:

var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];

function flattenDeep(arr1) {
   return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
}
flattenDeep(arr1);// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]

但是,我想问的问题有几个关于理论的问题:1。在我的理解中,函数以初始值acc开始,然后它继续循环所有元素以查看它是否是数组。

在这种情况下,前3个元素是1,2,3 - 因此不是数组,将作为数组累积并返回。

但是从它返回的第四个元素开始

Array.isArray(arr1[3]) 
(5) [1, 2, 3, 4, Array(3)]

在这种情况下,它触发条件acc.concat(flattenDeep(val)),这是函数的递归。这种情况如何有助于压扁阵列?

而对于后面的[],如果我的理解是正确的,它表明reduce的结果的返回形式应该是一个数组?

最后但并非最不重要的是,我应该寻找这个主题的任何好的参考?

谢谢你的帮助!

进一步阐述:

让我们说,现在上面的reduce函数中的val是[1,2,3,4,[[2,3,4]]]。

在第一轮检查中,元素1,2,3,4不是数组,但最后一个元素仍然存在,它使整个参数仍然是一个数组。对于下一轮递归,是否只需要元素[[2,3,4]]并进一步评估该数组中的元素?

或者通过这个例子,递归过程的第一轮,第二轮和第三轮结果是什么?

javascript arrays recursion reduce
1个回答
2
投票

reduce方法中的第二个参数是起始条件。如果没有提供任何内容,首先acc将是第一个数组的元素(请参阅mdn上的array.prototype.reduce)。

我不确定But there is nth to indicate the reduction of the array声明。你递归地调用函数,直到找到一个不是数组的东西,然后你返回那个值。

寻找js调用堆栈,了解js如何堆叠函数,你甚至可以绘制它,它肯定会有所帮助,因为它不容易:)

热门问题
推荐问题
最新问题