首页 > 解决方案 > 为什么函数返回未定义?

问题描述

我有一个数组,其中的每个值都意味着世界的一侧:

let array = ["NORTH", "SOUTH", "WEST", "EAST"];

如果 NORTH/SOUTH 或 EAST/WEST 站在一起,则这些值将被删除(SOUTH/NORTH 和 WEST/EAST 也被删除)。在这种情况下,函数必须返回空数组,而不是返回 undefined。谁能解释为什么会这样。对不起,我尽量不犯错误

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

标签: javascriptrecursion

解决方案


当您的递归函数拼接掉所有内容时,如示例中所示,函数的最深嵌套调用将不会迭代循环(因为数组为空),并返回undefined。该值也将从进行递归调用的点返回,因此主调用也将返回undefined

我建议不要使用递归,而是向后迭代。这样splice调用不会对数组迭代产生负面影响,并且您只需对数组进行一次扫描:

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

推荐阅读