代码之家  ›  专栏  ›  技术社区  ›  Ameen Shamsan

在javascript中的回调函数内部调用主函数

  •  -1
  • Ameen Shamsan  · 技术社区  · 2 年前

    我正在努力理解以下代码:

    let myArray = ["J", "a", "v", ["a", "scrip"], "t"];
    
    const flatten = (myArray) => {
      return myArray.reduce((flat, arry) => {
        return Array.isArray(arry) ? flat.concat(flatten(arry)) : flat.concat(arry);
      }, []).join("");
    };
    console.log(flatten(myArray));
    // Output => Javascript
    

    我很困惑为什么 flatten 在内部调用“Main function” reduce 的函数 arry 参数自 减少 函数通过 myArray ,为什么有必要?当我尝试移除 压平 内部调用 减少 回调函数,如下所示:

    const flatten = (myArray) => {
      return myArray.reduce((flat, arry) => {
        return Array.isArray(arry) ? flat.concat(arry) : flat.concat(arry);
      }, []).join("");
    };
    console.log(flatten(myArray))
    

    代码产生了相同的结果。那么,为什么需要主函数调用,它是如何产生影响的呢?我只需要了解事情是如何运作的。

    谢谢你的帮助。

    1 回复  |  直到 2 年前
        1
  •  1
  •   Geshode    2 年前

    不同之处在于 recursion .

    如果执行第一个版本,不管数组有多深,它总是返回 Javascript ,但如果去掉递归,那么最终会得到其他东西。

    使用递归

    let myArray = ["J", ["a", "v"], ["a", "s", ["c", ["r", "i"], "p"]], "t"];
    
    const flatten = (myArray) => {
      return myArray.reduce((flat, arry) => {
        return Array.isArray(arry) ? flat.concat(flatten(arry)) : flat.concat(arry);
      }, []).join("");
    };
    
    console.log(flatten(myArray))

    无递归

    let myArray = ["J", ["a", "v"], ["a", "s", ["c", ["r", "i"], "p"]], "t"];
    
    const flatten = (myArray) => {
      return myArray.reduce((flat, arry) => {
        return Array.isArray(arry) ? flat.concat(arry) : flat.concat(arry);
      }, []).join("");
    };
    
    console.log(flatten(myArray))

    您可以运行代码片段来查看它们如何返回不同的结果。

        2
  •  1
  •   Nashit Shayan    2 年前

    这叫做递归。其思想是,如果找到另一个数组,则遍历该数组,然后再次对该数组调用相同的函数。否则,只需将值连接到结果。

    使用以下数组,运行带有和不带有调用的代码 flatten 递归地,您将看到差异。

    let myArray = ["J", "a", "v", ["a", "scrip"], "t", [' ','is', [' ', 'awe', ['some']]]];