鉴于我有以下对象数组:
const data = [
{
name: 'item1',
score: 5,
colour: 'red'
},
{
name: 'item2',
score: 5,
colour: 'blue'
},
{
name: 'item1',
score: 5,
colour: 'blue'
},
{
name: 'item3',
score: 15,
colour: 'blue'
},
{
name: 'item2',
score: 25,
colour: 'green'
}
]
我正在寻找最语义化的方法来循环并累积score,因为name值是匹配的 - 示例结果(我们不关心颜色键):
[
{
name: item1,
score: 10
},
{
name: item2,
score: 30
},
{
name: item3,
score: 15
}
]
最终顺序并不重要,但数据将由网站访问者随机生成(例如,我们不知道每个名称的先验知识)可能有 2 个条目或最多 15 个条目。
现在,我正在用一种感觉很啰嗦(周日晚上!)的方法来解决这个问题:
const data = [
{
name: 'item1',
score: 5,
colour: 'red'
},
{
name: 'item2',
score: 5,
colour: 'blue'
},
{
name: 'item1',
score: 5,
colour: 'blue'
},
{
name: 'item3',
score: 15,
colour: 'blue'
},
{
name: 'item2',
score: 25,
colour: 'green'
}
];
let scoreData;
const checkScore = (data) => {
// check to see if we have existing data, if not create new array and pass in our initial data
if (!scoreData) {
scoreData = [];
scoreData.push(data);
}
// check to see if name is already present in our data, if so, accumulate the score
else if (scoreData.filter(e => e.name === data.name).length > 0) {
scoreData
.filter(e => e.name === data.name)
.map(e => e.score += data.score)
} else {
scoreData.push(data)
}
}
for (let i = 0; i < data.length; i++) {
// save data to new object to compare
let dataObj = {
name: data[i].name,
score: Number(data[i].score)
}
checkScore(dataObj)
}
console.log(scoreData)
我的直觉说这里有一种更清洁的方法,我很想找到一个!非常感谢任何反馈。也为糟糕的标题道歉!