gpt4 book ai didi

javascript - 使用 `for` 与 `slice` : why are the returns of these two functions different? 的数组展平递归中的空值

转载 作者:行者123 更新时间:2023-11-30 11:42:18 25 4
gpt4 key购买 nike

下面我提供了两个代码片段,在我看来,它们应该做同样的事情。在第一个片段中,我得到一个“空”值。我想这是因为当我在 上调用 steamrollArray(arr[0]) 时,null 值作为 arr 传递给函数[],将空值压入累加器。

我不知道,但我希望能得到一些帮助,避免这个特定问题的优雅方法是什么?

我希望两个函数在给定相同输入时提供相同的输出。

作为辅助点:我很想知道是否有人可以指出一种方法来将这两种方法相互比较 - 这是我一无所知的事情,除了它是“一件事, "这对我来说通常有助于理解如何做这样的事情,特别是如何处理这个问题。

作为另一个辅助点:是否有一个交互式 javascript 解释器,就像您可以获得一个交互式 python 解释器(您可以在其中玩/测试命令行中的东西)一样?

版本 1:“自然”递归 - 返回 [1,null,2,3]

function steamrollArray(arr) {
// I'm a steamroller, baby
//recursive (is an array)
var accum = [];
if (Array.isArray(arr)) {
accum = accum.concat(steamrollArray(arr[0]));
if (arr.length > 1) {
accum = accum.concat(steamrollArray(arr.slice(1)));
}
} else {
accum.push(arr);
}
return accum;
}

console.log(
steamrollArray([1, [], [3, [[4]]]])
);

版本 2:for 循环递归 - 返回 [1,2,3]

function steamrollArray(arr) {
// I'm a steamroller, baby
//recursive (is an array)
var accum = [];
for (var i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
accum = accum.concat(steamrollArray(arr[i]));
} else {
accum.push(arr[i]);
}
}
return accum;
}

console.log(
steamrollArray([1, [], [3, [[4]]]])
);

最佳答案

版本 1 中,您正在推送 arr[0]不检查 arr[0] 中是否有元素.所以在第二次调用 steamrollArray 时您传递空数组的位置 [] , arr[0]将是未定义的:

var arr = [];

console.log(arr[0]);

为什么这在版本 2 中没有发生?这是因为你有一个 for循环包装 push调用 ( for(var i = 0; i < arr.length... )。因此,当传递空数组时,for永远不会进入循环。因为0 < 0false .

您可以通过包装 push 来修复版本 1在这样的 if 语句中调用:(推送将在 steamrollArray 以参数 arr[0] 调用时发生)

if(arr.length) // if length is not 0
accum = accum.concat(steamrollArray(arr[0]));

辅助 2: NodeJs是一个很棒的 javascript 运行时。它带有一个命令行界面。试试吧!

关于javascript - 使用 `for` 与 `slice` : why are the returns of these two functions different? 的数组展平递归中的空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42183073/

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