下面我提供了两个代码片段,在我看来,它们应该做同样的事情。在第一个片段中,我得到一个“空”值。我想这是因为当我在 上调用
,将空值压入累加器。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 < 0
是false
.
您可以通过包装 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/