我有一个数组,每个值表示世界的一面:
let array = ["NORTH", "SOUTH", "WEST", "EAST"];
如果NORTH / SOUTH或EAST / WEST一起位于 ,则这些值将被删除(SOUTH / NORTH和WEST / EAST也将被删除)。在这种情况下,该函数必须返回空数组,而是返回未定义。谁能解释为什么会这样。 对不起错误,我尝试不让他们犯错
let array = ["NORTH", "SOUTH", "WEST", "EAST"];
let obj = {
"NORTH": 1,
"SOUTH": -1,
"WEST": 2,
"EAST": -2
}
function dirReduc(arr) {
for (let i = 0; i < arr.length; i++) {
if (i == arr.length - 1 || !arr.length) {
return arr;
} else if (obj[arr[i]] + obj[arr[i + 1]] == 0) {
arr.splice(i, 2);
return dirReduc(arr);
}
}
}
console.log(dirReduc(array));
答案 0 :(得分:1)
当您的递归函数拼接掉所有所有内容时,如示例中所示,该函数的最深层嵌套调用将不会迭代循环(因为数组为空),并返回{{1} }。也会从进行递归调用的位置返回此值,因此主调用也将返回undefined
。
我建议不要使用递归,而是向后迭代。这样,undefined
调用不会对数组迭代产生负面影响,并且只对数组进行一次扫描:
splice
答案 1 :(得分:0)
您可以修改如下:
let array = ["NORTH", "SOUTH", "WEST", "EAST"];
let obj = {
"NORTH": 1,
"SOUTH": -1,
"WEST": 2,
"EAST": -2
}
function dirReduc(arr) {
for (let i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
return arr;
} else if (obj[arr[i]] + obj[arr[i + 1]] == 0) {
arr.splice(i, 2);
if (arr.length == 0)
return [];
return dirReduc(arr);
}
}
}
console.log(dirReduc(array));
希望这会有所帮助。
答案 2 :(得分:0)
您的数组长度降至0,因此for循环甚至没有运行。
for (let i = 0; i < arr.length; i++) {