JavaScript题的箭头函数——多箭头函数嵌套
Arrow Function of JavaScript question - Multiple Arrow Function nesting
我在leetcode上练习JS的时候看到一个答案,但是看不懂这是什么意思。任何人都可以扩展代码吗?或者告诉我如何阅读。
https://leetcode.com/problems/running-sum-of-1d-array/discuss/702025/one-liner
let runningSum = nums => nums.map((sum => el => sum += el)(0));
console.log(runningSum([1,2,3,4]))
让我们试着分解一下。
(sum => el => sum += el)
,相当于:
const mySumFunction = (sum) => {
const addToSum = (el) => {
sum += el;
return sum;
}
return addToSum;
}
这是一个接受参数的函数 - 起始总和。 sum 参数也是函数范围内的局部变量。
当您调用 mySumFunction 时,它 returns 另一个函数添加到局部作用域变量 sum 和 returns 目前的总和。
实际上,它创建了一个“有记忆的函数”,returns 到目前为止已传递给它的所有内容的总和。
您可以按如下方式进行测试:
cumilativeSum = mySumFunction(0)
console.log(v(1)) // returns 1
console.log(v(1)) // returns 2
console.log(v(4)) // returns 6
现在让我们从整体上看一下代码。
let runningSum = nums => nums.map((sum => el => sum += el)(0));
传递到 map 函数的整个代码段:(sum => el => sum += el)(0)
创建一个从 0 开始的“带内存的求和函数”,正如我们在上面计算的那样。
我们将数组中的每个数字传递给它,并创建一个包含累积和的数组。
原函数
let runningSum = nums => nums.map((sum => el => sum += el)(0));
(sum => el => sum += el)
是
function f1(sum) {
return function f2(el) {
return sum += el;
}
}
(或@Alterlife 所示的箭头格式)
原函数再变换为
let runningSum = nums => nums.map(f1(0));
然后 nums.map(f1(0));
变成
const result = [];
const f2 = f1(0);
for(let i = 0; i < nums.length; ++i) {
const num = nums[i];
result.push(f2(num));
}
所以加在一起,原函数变成了
const nums = [1,2,3,4];
function f1(sum) {
return function f2(el) {
return sum += el;
}
}
const result = [];
const f2 = f1(0);
for(let i = 0; i < nums.length; ++i) {
const num = nums[i];
result.push(f2(num));
}
console.log(result);
让我们将(sum => el => sum += el)(0)
这个自调用箭头函数用于地图的第一次迭代。执行它 return 另一个箭头函数 el => sum += el
。 sum 的值为 0
作为参数传递。现在继续我们的地图第一次迭代
let runningSum = nums => nums.map(el => sum = 0 + el);
它returns 1。所以,对于第2次迭代,sum的值为1,el为2。
所以它 return 是 3,然后是 6,然后是 10。
let runningSum = (nums) =>
nums.map(
(function (sum) {
return (el) => (sum += el);
})(0)
);
console.log(runningSum([1, 2, 3, 4]));
我在leetcode上练习JS的时候看到一个答案,但是看不懂这是什么意思。任何人都可以扩展代码吗?或者告诉我如何阅读。
https://leetcode.com/problems/running-sum-of-1d-array/discuss/702025/one-liner
let runningSum = nums => nums.map((sum => el => sum += el)(0));
console.log(runningSum([1,2,3,4]))
让我们试着分解一下。
(sum => el => sum += el)
,相当于:
const mySumFunction = (sum) => {
const addToSum = (el) => {
sum += el;
return sum;
}
return addToSum;
}
这是一个接受参数的函数 - 起始总和。 sum 参数也是函数范围内的局部变量。
当您调用 mySumFunction 时,它 returns 另一个函数添加到局部作用域变量 sum 和 returns 目前的总和。
实际上,它创建了一个“有记忆的函数”,returns 到目前为止已传递给它的所有内容的总和。
您可以按如下方式进行测试:
cumilativeSum = mySumFunction(0)
console.log(v(1)) // returns 1
console.log(v(1)) // returns 2
console.log(v(4)) // returns 6
现在让我们从整体上看一下代码。
let runningSum = nums => nums.map((sum => el => sum += el)(0));
传递到 map 函数的整个代码段:(sum => el => sum += el)(0)
创建一个从 0 开始的“带内存的求和函数”,正如我们在上面计算的那样。
我们将数组中的每个数字传递给它,并创建一个包含累积和的数组。
原函数
let runningSum = nums => nums.map((sum => el => sum += el)(0));
(sum => el => sum += el)
是
function f1(sum) {
return function f2(el) {
return sum += el;
}
}
(或@Alterlife 所示的箭头格式)
原函数再变换为
let runningSum = nums => nums.map(f1(0));
然后 nums.map(f1(0));
变成
const result = [];
const f2 = f1(0);
for(let i = 0; i < nums.length; ++i) {
const num = nums[i];
result.push(f2(num));
}
所以加在一起,原函数变成了
const nums = [1,2,3,4];
function f1(sum) {
return function f2(el) {
return sum += el;
}
}
const result = [];
const f2 = f1(0);
for(let i = 0; i < nums.length; ++i) {
const num = nums[i];
result.push(f2(num));
}
console.log(result);
让我们将(sum => el => sum += el)(0)
这个自调用箭头函数用于地图的第一次迭代。执行它 return 另一个箭头函数 el => sum += el
。 sum 的值为 0
作为参数传递。现在继续我们的地图第一次迭代
let runningSum = nums => nums.map(el => sum = 0 + el);
它returns 1。所以,对于第2次迭代,sum的值为1,el为2。 所以它 return 是 3,然后是 6,然后是 10。
let runningSum = (nums) =>
nums.map(
(function (sum) {
return (el) => (sum += el);
})(0)
);
console.log(runningSum([1, 2, 3, 4]));