Array.prototype.reduce方法的回调中的累加器上的“ get”方法指的是什么?

时间:2019-01-25 11:20:07

标签: javascript

标题似乎很冗长,但参考此问题中发布的答案:https://stackoverflow.com/a/37623524/4111415

我想知道let count = prev.get(curr.key) || 0;的实际含义。据我所知,累加器(prev)只是一个数字; get方法在这里实际做什么?我看了MDN文档无济于事:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

let objArr = [
  {key: 'Mon Sep 23 2013 00:00:00 GMT-0400', val: 42},
  {key: 'Mon Sep 24 2013 00:00:00 GMT-0400', val: 78},
  {key: 'Mon Sep 25 2013 00:00:00 GMT-0400', val: 23},
  {key: 'Mon Sep 23 2013 00:00:00 GMT-0400', val: 54}
];

// first, convert data into a Map with reduce
let counts = objArr.reduce((prev, curr) => {
  let count = prev.get(curr.key) || 0;
  prev.set(curr.key, curr.val + count);
  return prev;
}, new Map());

// then, map your counts object back to an array
let reducedObjArr = [...counts].map(([key, value]) => {
  return {key, value}
})

console.log(reducedObjArr);

4 个答案:

答案 0 :(得分:1)

  

据我所知,累加器(prev)只是一个数字

不,并非总是如此。如果在.reduceinitialValue参数中指定了一个值,则累加器(在这种情况下为prev)将采用该初始值的值。

示例中的初始值为new Map(),它是一个地图对象。 Map prototype包括.get方法,该方法用于从地图对象中检索特定值(类似于对象键值对检索)。

因此,您的.get方法引用的是Map对象,而不是数字。

答案 1 :(得分:0)

prev,即accumulator实际上是一个Map对象,该对象作为最后一个参数传递到.reduce()函数。

答案 2 :(得分:0)

在所提供的示例中,累加器是Map对象(而不是数字)的实例,该对象作为最后一个参数(initial value)传递以进行归约。

答案 3 :(得分:0)

Map#getMap原型的一部分。

由于Map#set中的fluent interface,您可以通过直接返回地图来简化缩小操作。

要获取格式化结果,可以将Array.from与映射功能一起使用。


也许您对使用prevcurr感到有些恼火。如果改用mapitem,则可能会更好地获得变量的类型。

let objArr = [{ key: 'Mon Sep 23 2013 00:00:00 GMT-0400', val: 42 }, { key: 'Mon Sep 24 2013 00:00:00 GMT-0400', val: 78 }, { key: 'Mon Sep 25 2013 00:00:00 GMT-0400', val: 23 }, { key: 'Mon Sep 23 2013 00:00:00 GMT-0400', val: 54 }],
    counts = objArr.reduce(
        (map, item) => map.set(item.key, item.val + (map.get(item.key) || 0)),
        new Map
    ),
    reducedObjArr = Array.from(counts, ([key, value]) => ({ key, value }));

console.log(reducedObjArr);
.as-console-wrapper { max-height: 100% !important; top: 0; }