JavaScript问题的箭头功能-多个箭头功能嵌套

时间:2020-08-11 03:39:58

标签: javascript arrays sum running-total

我在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]))

3 个答案:

答案 0 :(得分:2)

让我们尝试将其分解。

(sum => el => sum += el)等效于:

const mySumFunction = (sum) => {

   const addToSum = (el) => { 
      sum += el;
      return sum;
   }

   return addToSum;
}

这是一个带有参数的函数-起始和。 sum参数也是函数范围内的局部变量。

调用mySumFunction时,它将返回另一个函数,该函数将添加到局部范围的变量sum并返回到目前为止的总和。

实际上,它创建了一个“带有内存的函数”,该函数返回到目前为止已传递给它的所有内容的总和。

您可以如下进行测试:

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开始的“带有内存的sum函数”,如上所示。

我们将数组中的每个数字传递给它,并使用累积和创建一个数组。

答案 1 :(得分:2)

原始功能

let theme = 'dark' //Get this from URL
let class = theme=='dark'?'dark-theme-class':'default-theme';
document.body.classList.toggle(class);

let runningSum = nums => nums.map((sum => el => sum += el)(0));

(sum => el => sum += el)

(或@Alterlife所示的箭头格式)

原始函数然后转换为

function f1(sum) {
  return function f2(el) {
    return sum += el;
  }
}

然后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));
}

答案 2 :(得分:0)

让我们(sum => el => sum += el)(0)使用此自调用箭头函数进行地图的第一次迭代。在执行时,它返回另一个箭头函数el => sum += el。 sum的值为0,它作为参数传递。现在继续进入我们的地图第一次迭代

let runningSum = nums => nums.map(el => sum = 0 + el);

它返回1。因此,对于第二次迭代,总和的值为1,el为2。 因此它返回3,然后是6,然后是10。

let runningSum = (nums) =>
  nums.map(
   (function (sum) {
         return (el) => (sum += el);
   })(0)
  );
console.log(runningSum([1, 2, 3, 4]));