如何解决如何遍历对象数组并根据单独的匹配值累积一个值
鉴于我有以下对象数组:
const data = [
{
name: 'item1',score: 5,colour: 'red'
},{
name: 'item2',colour: 'blue'
},{
name: 'item1',{
name: 'item3',score: 15,score: 25,colour: 'green'
}
]
鉴于 name 值是匹配的 - 示例结果(我们不关心颜色键):
[
{
name: item1,score: 10
},{
name: item2,score: 30
},{
name: item3,score: 15
}
]
最终的顺序并不重要,但数据将由网站访问者随机生成(例如,我们不知道每个名称)可能有 2 个条目或最多共 15 个。
现在,我正在用一种长篇大论(周日晚上!)的方法来解决这个问题:
const data = [
{
name: 'item1',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)
我的直觉告诉我这里有一种更简洁的方法,我很想找到一种方法!非常感谢任何反馈。也为糟糕的标题道歉!
解决方法
array.reduce()
就是为此而生的!它循环遍历数组中的每个项目,并在本例中检查我们是否已经使用了该团队名称。如果是这样,我们将添加到该项目的“分数”值。如果没有,我们在返回数组中设置一个新项目。
编辑答案已更新以支持 IE,这意味着取消箭头函数和 findIndex
const data = [{
name: 'item1',score: 5,colour: 'red'
},{
name: 'item2',colour: 'blue'
},{
name: 'item1',{
name: 'item3',score: 15,score: 25,colour: 'green'
}
]
let scores = data.reduce(function(b,a) {
delete a.colour;
let ind=-1;
b.forEach(function(e,i) { if (e.name === a.name) ind = i});
if (ind > -1) b[ind].score += a.score;
else b.push(a);
return b
},[])
console.log(scores)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。