为什么函数返回未定义?

时间:2019-12-04 06:07:05

标签: javascript recursion

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

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));

3 个答案:

答案 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++) {