为什么减少不打印第一个值?

时间:2017-04-18 18:01:10

标签: javascript

我正在尝试学习如何在此处使用reduce,这只会记录b,c,d

['a', 'b', 'c', 'd'].reduce(function(acc, cur){
  console.log(cur);
  return cur;
})

我不明白累加器是什么。我甚至在阅读完文档后也不知道它是如何工作的。

Current似乎不是current,因为'a'被跳过。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

编辑:这是一组更好的测试用例:

enter image description here

6 个答案:

答案 0 :(得分:10)

reduce的要点是它从数组中获取连续的元素对,对该对执行操作,然后将该操作的结果(累加器)作为下一遍的左手操作数。

也就是说,给定[a, b, c, d].reduce(f)确实如此:

   f(a, b)
-> f(f(a, b), c)
-> f(f(f(a, b), c), d)

您只记录第二个参数,因此a永远不会出现。

(为方便起见,我忽略了传递给index的额外arrayf参数

如果要使用数组中第一个元素以外的其他内容作为第一个左手操作数,则使用未提供的可选“初始值”参数。如果您不提供,那么,正如您所发现的那样,acccur的第一个值将是"a""b"

reduceRight函数接受数组另一端的参数:

   f(c, d)
-> f(b, f(c, d))
-> f(a, f(b, f(c, d)))

答案 1 :(得分:6)

根据Array#reduce的API,如果累积器不应该是第一个元素,则需要指定initialValue

  

<强>初值

     

[可选]用作第一次调用回调的第一个参数的值。如果未提供初始值,则将使用数组中的第一个元素。在没有初始值的情况下调用空数组上的reduce是一个错误。

['a', 'b', 'c', 'd'].reduce(function(acc, cur){
    console.log(cur);
    return cur;
}, undefined);
// ^^^^^^^^^

答案 2 :(得分:1)

当我看到真实世界的例子时,我更容易理解事情,所以我们假设我们有一个这样的数组:

let products = [
    { label: 'Product 1', price: 5  },
    { label: 'Product 2', price: 15 },
    { label: 'Product 3', price: 20 },
];

然后我们要计算总价:

let totalPrice = products.reduce((acc, product) => {
    return acc + product.price;
}, 0); // 0 - initial value

console.log(totalPrice);

并且它不会记录a,因为如果没有指定初始值,它将把第一个元素作为初始值。

答案 3 :(得分:0)

第一次中的第一个参数是[0],第二个是[1]。

时间第一个参数是f([0],[1]),第二个是[2]等等

答案 4 :(得分:0)

提到docs

  

reduce()方法对累加器和数组中的每个元素(从左到右)应用一个函数,将其减少为单个值。

这清楚地说明了

['a', 'b', 'c', 'd'].reduce(function(acc, cur){
  console.log(cur);
  return cur;
})

reduce每次将{id {1}}和a,b,c cur作为b,c,d

给出acc值

每次获得a,b b,cc,d

答案 5 :(得分:0)

例如,

['a', 'b', 'c', 'd'].reduce(function(acc, cur){
  console.log(acc);
  return acc+cur;
})

您将获得以下信息:

ab
abc
abcd

array.reduce()一次获取数组中的一个元素,并根据回调函数生成输出并将其存储在累加器中。因此,对于每次迭代,您都有前一个结果(累加器)和当前元素来产生下一个结果。累加器值以数组中第一个元素的值开始。