关于使用reduce和concat进行扁平化使用递归的概念

时间:2018-09-09 13:51:13

标签: javascript arrays recursion reduce

现在我想用多层平整数组

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

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]]]并进一步评估此数组中的元素?

或者在此示例中,递归过程的第一,第二和第三轮结果将是什么?

1 个答案:

答案 0 :(得分:2)

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

我不确定But there is nth to indicate the reduction of the array语句。您将递归调用函数,直到找到不是数组的东西,然后返回该值。

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