【发布时间】:2020-12-03 15:45:26
【问题描述】:
假设我有:
const map1 = [
{ id: 1, res: { a: `1-a`, b: `1-b` } },
{ id: 2, res: { a: `2-a`, b: `2-b`, c: `2-c`, d: `2-d` } },
{ id: 3, res: { a: `3-a`, b: `3-b`, c: `3-c` } }
]
const map2 = [
{ map1: { 1: 'a', 2: 'c', 3: 'b' } },
{ map1: { 1: 'b', 2: 'c', 3: 'a' } },
{ map1: { 1: 'a', 2: 'a' } },
{ map1: { 1: 'a', 2: 'a', 3: 'b' } },
{ map1: { 2: 'd', 3: 'a' } },
{ map1: { 1: 'a', 2: 'c', 3: 'c' } },
{ map1: { 1: 'b', 2: 'd', 3: 'c' } },
{ map1: { 1: 'b', 3: 'a' } }
]
这是我想要得到的结果:
const result = {
1: { a: 4, b: 3 },
2: { a: 2, b: 0, c: 3, d: 1 },
3: { a: 3, b: 2, c: 2 }
}
result 是一个对象,其键是 map1 ids,值是包含累积和的对象。
例如:
result[2] = { a: 2, b: 0, c: 3, d: 1 } 因为在map2.map1 中循环每个对象并使用键2 查看值(2 因为我们正在寻找结果[2])有2 次a,0 次b,3次c和1次d。
我想我必须使用reduce,但如何使用?对我来说似乎太复杂了..
这是我的出发点:
const results = map2.reduce((accumulator, current) => {
// ??
return accumulator
}, [])
【问题讨论】:
-
不清楚你在数什么。声明
result[2] is { a: 2, b: 0, c: 3, d: 1 } because looping map2 and looking at each object (inside map1) with key 2 there are 2 times a, 0 times b, 3 times c and 1 time d.无法识别 - 是什么让 key===2? -
@mplungjan 谢谢你的回答。解释起来有点复杂,但我试图在主要信息中做得更好
-
在结果中,您是否想要计数为
0的那些?这个例子没有说明这一点。为什么result[1]中没有c: 0, d: 0而result[2]中有b: 0? -
@whitecircle 应该
d: 1是d: 2,因为2: 'd'出现在两个对象中? -
@JimNilsson 因为
map1中的第一个对象只有a和b,没有c或d
标签: javascript mapreduce