【问题标题】:Why does a function return undefined?为什么函数返回未定义?
【发布时间】:2020-03-28 21:23:42
【问题描述】:

我有一个数组,其中的每个值都表示世界的一侧:

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

【问题讨论】:

  • 该函数中没有一个 return 语句,您如何期望返回任何内容?您在适当的位置修改数组 - 执行 dirReduc(array); console.log(array); 并查看差异。
  • 如果任何一个条件没有通过,函数就会执行到最后,此时没有return 语句。
  • 抱歉,我解决了这个问题。
  • 在两次递归调用之后,您的数组将为空,因此在最深的调用中,循环在没有迭代的情况下完成,然后...什么也不返回(没有return),即@987654326 @。这也将在递归的上层返回。

标签: javascript recursion


【解决方案1】:

您的数组的长度已降至 0,因此 for 循环甚至没有运行。

for (let i = 0; i < arr.length; i++) {

【讨论】:

    【解决方案2】:

    当您的递归函数拼接掉所有 内容时,就像在示例中一样,函数的最深嵌套调用将不会迭代循环(因为数组为空),并返回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;       
    } 
    

    【讨论】:

      【解决方案3】:

      可以修改如下:

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

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-04
        • 2021-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多