Javascript 为什么函数返回未定义?
我有一个数组,每个数组的值表示世界的一个方面: 让数组=[北、南、西、东]; 如果北/南或东/西同时存在,则这些值将被删除,南/北和西/东也将被删除。在这种情况下,函数必须返回空数组,而不是返回未定义的数组。有人能解释为什么会发生这种情况吗。 为这些错误感到抱歉,我尽量不犯 让数组=[北、南、西、东]; 设obj={ 北:1, 南部:-1, 西:2, 东:-2 } 函数dirreducearr{ 对于let i=0;iJavascript 为什么函数返回未定义?,javascript,recursion,Javascript,Recursion,我有一个数组,每个数组的值表示世界的一个方面: 让数组=[北、南、西、东]; 如果北/南或东/西同时存在,则这些值将被删除,南/北和西/东也将被删除。在这种情况下,函数必须返回空数组,而不是返回未定义的数组。有人能解释为什么会发生这种情况吗。 为这些错误感到抱歉,我尽量不犯 让数组=[北、南、西、东]; 设obj={ 北:1, 南部:-1, 西:2, 东:-2 } 函数dirreducearr{ 对于let i=0;i
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));
希望这有帮助。当递归函数拼接掉所有内容时,如示例中所示,函数的最深嵌套调用不会迭代循环,因为数组是空的,并且返回未定义的。这个值也将从进行递归调用的点返回,因此主调用也将返回未定义的值 我建议不要使用递归,而是向后迭代。这样,拼接调用不会对阵列迭代产生负面影响,并且您只需在阵列上执行一次扫描:
function dirReduc(arr) {
for (let i = arr.length-2; i >= 0; i--) {
if (obj[arr[i]] + obj[arr[i + 1]] == 0) arr.splice(i, 2);
}
return arr;
}
您的数组长度已降至0,因此for循环甚至无法运行
for (let i = 0; i < arr.length; i++) {
这个函数中没有一个return语句,您怎么能期望返回任何东西呢?您可以就地修改数组-do dirreducearray;console.logarray;看到区别了吧。如果没有传递任何一个条件,函数会一直执行到最后,没有返回语句。很抱歉,我解决了这个问题。在两次递归调用之后,数组将为空,因此在最深的调用中,循环会在没有迭代的情况下完成,然后。。。不返回任何内容不返回,这是未定义的。这也将在递归的上层返回。