Javascript 为什么函数返回未定义?

Javascript 为什么函数返回未定义?,javascript,recursion,Javascript,Recursion,我有一个数组,每个数组的值表示世界的一个方面: 让数组=[北、南、西、东]; 如果北/南或东/西同时存在,则这些值将被删除,南/北和西/东也将被删除。在这种情况下,函数必须返回空数组,而不是返回未定义的数组。有人能解释为什么会发生这种情况吗。 为这些错误感到抱歉,我尽量不犯 让数组=[北、南、西、东]; 设obj={ 北:1, 南部:-1, 西:2, 东:-2 } 函数dirreducearr{ 对于let i=0;i

我有一个数组,每个数组的值表示世界的一个方面:

让数组=[北、南、西、东]; 如果北/南或东/西同时存在,则这些值将被删除,南/北和西/东也将被删除。在这种情况下,函数必须返回空数组,而不是返回未定义的数组。有人能解释为什么会发生这种情况吗。 为这些错误感到抱歉,我尽量不犯

让数组=[北、南、西、东]; 设obj={ 北:1, 南部:-1, 西:2, 东:-2 } 函数dirreducearr{ 对于let i=0;iconsole.logdir数组 您可以按如下方式修改:

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;看到区别了吧。如果没有传递任何一个条件,函数会一直执行到最后,没有返回语句。很抱歉,我解决了这个问题。在两次递归调用之后,数组将为空,因此在最深的调用中,循环会在没有迭代的情况下完成,然后。。。不返回任何内容不返回,这是未定义的。这也将在递归的上层返回。