在 javascript 中的回调函数中调用 main 函数

Calling the main function inside a callback function in javascript

提问人:Ameen Shamsan 提问时间:6/16/2023 最后编辑:Ameen Shamsan 更新时间:6/16/2023 访问量:40

问:

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

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

我对为什么在带有参数的函数中调用“Main 函数”感到困惑。既然函数经过了 ,为什么还需要呢?当我尝试删除回调函数中的调用时,如下所示:flattenreducearryreducemyArrayflattenreduce

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

代码产生了相同的结果。那么,为什么需要主函数调用,它又有什么不同呢?我只需要了解事情的真正运作方式。

感谢您的帮助。

JavaScript 数组回 展平

评论

2赞 Jaromanda X 6/16/2023
好吧,试试 - 顺便说一句,不会吗?["J", "a", "v", ["a", "s", ["cr", "ip"]], "t"]return Array.isArray(arry) ? flat.concat(arry) : flat.concat(arry);return flat.concat(arry);
2赞 Quentin 6/16/2023
考虑实际是什么,然后是测试什么,然后创建一些混合了数组和非数组值的测试数据,然后在没有递归调用的情况下尝试测试数据。arryArray.isArray(arry)arry
0赞 Jaromanda X 6/16/2023
顺便说一句,现代JS ... 执行该代码执行的操作myArray.flat(Infinity).join('')

答:

1赞 Geshode 6/16/2023 #1

区别在于递归

如果你做第一个版本,不管数组有多深,它总是返回,但如果你去掉递归,那么你最终会得到别的东西。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))

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

1赞 Nashit Shayan 6/16/2023 #2

这就是所谓的递归。这个想法是你遍历这个数组,如果找到另一个数组,然后再次调用该数组的相同函数。否则,只需将值连接到结果即可。

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

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