标题似乎很冗长,但参考此问题中发布的答案: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);
答案 0 :(得分:1)
据我所知,累加器(prev)只是一个数字
不,并非总是如此。如果在.reduce
的initialValue
参数中指定了一个值,则累加器(在这种情况下为prev
)将采用该初始值的值。
示例中的初始值为new Map()
,它是一个地图对象。 Map
prototype包括.get
方法,该方法用于从地图对象中检索特定值(类似于对象键值对检索)。
因此,您的.get
方法引用的是Map
对象,而不是数字。
答案 1 :(得分:0)
答案 2 :(得分:0)
在所提供的示例中,累加器是Map对象(而不是数字)的实例,该对象作为最后一个参数(initial value)传递以进行归约。
答案 3 :(得分:0)
由于Map#set
中的fluent interface,您可以通过直接返回地图来简化缩小操作。
要获取格式化结果,可以将Array.from
与映射功能一起使用。
也许您对使用prev
和curr
感到有些恼火。如果改用map
和item
,则可能会更好地获得变量的类型。
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; }