【问题标题】:How does the accumulator value in reduce method change without explicitly changing it?reduce 方法中的累加器值如何在不显式更改的情况下更改?
【发布时间】:2021-07-15 05:41:41
【问题描述】:

这是我第一次在这里写,所以提前道歉。

我很确定我对 reduce() 方法有很好的掌握,但我似乎无法特别理解一个概念。在这个特定的问题中,我们被要求找到所有数组参数共享的元素。我能够使用 reduce 方法构建答案。我知道它有效,并且我知道有更有效的解决方案,但我似乎无法理解累加器值如何自我修正,即使我没有重新分配它的值。

让我解释一下:在第二个数组的当前值的第一次迭代之后,我检查当前元素是否与我的累加器(第一个数组)共享共性。在检查公共值并将其推送到结果中之后,results = [5, 15, 7]。下一次迭代开始时的累加器值也成为我的一组结果值,但同样,我没有明确地重新分配累加器值,例如 acc = results 。累加器如何在没有显式更改的情况下“理解”更改?我只是按原样接受了这种机制,但希望得到解释。请让我知道我是否应该提供更多说明。谢谢!

function intersection(arrays) {
    return arrays.reduce((acc, curr) => {
// here, acc = the first array --> 5, 15, 7 --> 15, 5
    
    let results = []

    for(let element of curr) {
      if(acc.includes(element)) results.push(element)
    }

// here, results = 5, 15, 7 --> 15, 5 --> 15, 5
    
    return results
  })
}

const arr1 = [5, 10, 15, 20, 7, 3];
const arr2 = [15, 88, 1, 5, 7, 21];
const arr3 = [1, 10, 15, 5, 20, 21];

console.log(intersection([arr1, arr2, arr3])); 
// should log: [5, 15]

【问题讨论】:

  • 如果您使用 set 会更容易。
  • 当你从reduce返回一些东西时,它将在下一次迭代中变成acc
  • 它正在记录[15, 5],那么除此之外您还有什么期望?
  • @charlietfl,我已阅读文档并将此特定定义解释为与您返回 acc 的情况有关。但是,它适用于任何返回值是有道理的:“您的 reducer 函数的返回值被分配给累加器,其值在整个数组的每次迭代中都会被记住,并最终成为最终的单一结果值。”

标签: javascript reduce


【解决方案1】:

你可能会更好地理解这个基本版本的 reduce ,它在调用时简单地对数组值求和

Array.prototype.myReduce = function(callback, start) {
  // inital value of acc is start value `0` set in call
  let acc = start; 

  this.forEach((elem, i) => {
    // acc gets assigned the return value from the callback 
    // every iteration of this internal loop
    acc = callback(acc, elem, i, this)
  });
  // then finally gets returned from the outer function
  return acc
};

const arr = [1, 2, 3]

const res = arr.myReduce((a, c, i, arr) => {
  return a + c // returned to `acc` in the forEach loop above
}, 0)

console.log('Result:', res) // expect 1+2+3 = 6

【讨论】:

  • 我主要了解 reduce 的工作原理,特别是这个函数明确地重新分配 acc 并返回它。但是,我上面展示的示例没有显式返回 acc 也没有重新分配它,但 acc 仍然在每次迭代后从结果中获取值。我了解到这只是 reduce 的固有特性。
  • 你错过了重点。您返回的任何内容都会在下一次迭代中变为acc,或者在最后一次迭代中变为最终结果。我的例子是 reduce 如何在幕后工作。在您的示例中,您返回results,它将成为下一个acc。没有什么说您需要返回相同的 acc 。您返回的内容取决于用例
  • 啊,明白了。感谢查理的澄清!
猜你喜欢
  • 2012-07-10
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 2013-09-10
  • 2013-10-25
相关资源
最近更新 更多