我正在尝试在lodash中堆叠JavaScript对象数组值,其中每个数组值都要映射到生成的对象数组中的相应对象。例如:
olympicmedals = {
'2008': [{'country': 'China', 'golds': 51}, {'country': 'USA', 'golds': 36}],
'2012': [{'country': 'China', 'golds': 38}, {'country': 'USA', 'golds': 46}]
}
期望的结果:
olympicmedals = [
{'country': 'China', 'golds2008': 51, 'golds2012': 38},
{'country': 'USA', 'golds2008': 36, 'golds2012': 46}
]
Fwiw,这是用于amCharts中的图表,例如here(点击其中的“查看演示源”)。
我假设_.map()函数是要走的路,只是不太确定如何继续。谢谢!
答案 0 :(得分:2)
您可以使用forEach()
循环,但您还必须循环数组中的每个对象,以便为键添加年数。它还可以处理更多的对象属性而不仅仅是金牌。
var data = {
'2008': [{
'country': 'China',
'golds': 51,
silver: 10
}, {
'country': 'USA',
'golds': 36
}],
'2012': [{
'country': 'China',
'golds': 38
}, {
'country': 'USA',
'golds': 46,
bronze: 10
}]
}
var result = []
Object.keys(data).forEach(function(e) {
var that = this;
data[e].forEach(function(a) {
if (!that[a.country]) {
that[a.country] = {
country: a.country
}
Object.keys(a).forEach(function(key) {
if (key != 'country') that[a.country][e + key] = a[key]
})
result.push(that[a.country])
} else {
Object.keys(a).forEach(function(key) {
if (key != 'country') that[a.country][e + key] = a[key]
})
}
})
}, {})
console.log(JSON.stringify(result, 0, 4))

答案 1 :(得分:1)
有点晚了,但这是一个地图/缩小方式:
o = {
'2008': [{'country': 'China', 'golds': 51}, {'country': 'USA', 'golds': 36}],
'2012': [{'country': 'China', 'golds': 38}, {'country': 'USA', 'golds': 46}]
}
const countries = o[Object.keys(o)[0]].map(e => e.country)
const result = countries.map(country => {
return Object.keys(o).reduce((p, year) => {
p[`golds${year}`] = o[year].find(e => e.country === country).golds
return p
}, {country})
})
console.log(result)
对于这种转换任务,我发现首先获取列信息并将其存储在变量(countries
)中是很方便的,基于哪一个filter
或find
以后的相关数据。可能还有一种方法可以在没有任何本地状态的情况下执行此操作,但我可以想象它不会非常易读。