gpt4 book ai didi

javascript - 展平数组理解代码

转载 作者:行者123 更新时间:2023-11-27 22:51:57 25 4
gpt4 key购买 nike

在我的另一个问题中,有人发布了一个非常酷的解决方案,关于如何将第 n 个嵌套数组展平为一个数组。由于我不想开始长时间的聊天,而且我仍然没有真正完全理解这段代码的作用,所以我想我应该问一下。

所以我的印象是,首先在这种情况下我们的数组长度为 2,然后在 while 循环中它变成 1。然后我们检查array[1],是一个数组。正是如此,我们继续前进。现在我有点困惑。我相信我们再次调用 flatten 函数,以便我们可以进入嵌套数组,但我对推理仍然有点模糊。然后我们对 array[1] 进行切片,这里切片不只是意味着获取整个 array[l] 吗?因为我们从第 0 个位置到末尾,因为 slice() 没有参数。

function flatten(array) {
var l = array.length, temp;
while (l--) {
if (Array.isArray(array[l])) {
flatten(array[l]);
temp = array[l].slice();
temp.unshift(1);
temp.unshift(l);
[].splice.apply(array, temp);
}
}
}


var array = [['1', '2', '3'], ['4', '5', ['6'], ['7', '8']]];

flatten(array);

console.log(array);

https://jsfiddle.net/curw7mdp/

最佳答案

所以我假设您了解递归的基础知识。我将逐行引导您完成。

var l = array.length, temp;

声明 l 等于数组的长度,并声明 temp。

while (l--)

这会在循环迭代之后递减 l (与 --l 之前执行的操作相反);

if (Array.isArray(array[l]))

这是检查数组中的第 'l' 个元素是否是另一个数组。这很重要,因为这意味着该元素不是平坦的。

flatten(array[l]);

这就是它有趣的地方,该函数递归地调用自身,以便它现在可以遍历子数组。而如果子数组包含另一个数组,它可以继续深入下去。我相信这是头递归。

temp = array[l].slice();

看起来有点奇怪,但这允许我们将数组提取到一个名为 temp 的新变量中。

temp.unshift(1);
temp.unshift(l);
[].splice.apply(array, temp);

这也是一种非常笨拙的编写方式,但基本上它将 1 和 l 作为 temp 数组中元素的第一个,然后以 temp 作为参数对数组调用 splice。只有 temp 的前两个元素作为参数传递(我们刚刚放入的两个元素),因此它基本上删除了子数组,并将其替换为扁平版本。

关于javascript - 展平数组理解代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37976376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com