Javascript 正在收集对象中的相同项

Javascript 正在收集对象中的相同项,javascript,node.js,Javascript,Node.js,我想在一个列表中总结我在下面指定的对象的时间部分 这是我的目标 var list = [ { 'user': 'Tom', time: 270547 }, { 'user': 'Alex', time: 82081 }, { 'user': 'Bob', time: 58702 }, { 'user': 'Tom', time: 53944 }, { 'user': 'Bob', time: 44938 }, { 'user': 'Bob', time: 24353 } ] 我想把代

我想在一个列表中总结我在下面指定的对象的时间部分 这是我的目标

var list = [
{ 'user': 'Tom', time: 270547 },

{ 'user': 'Alex', time: 82081 },

{ 'user': 'Bob', time: 58702 },

{ 'user': 'Tom', time: 53944 },

{ 'user': 'Bob', time: 44938 },

{ 'user': 'Bob', time: 24353 }
]
我想把代码转换成这样, 总时间=顶部对象中时间部分的总和

{ 'user': 'Tom', time: totaltime },

{ 'user': 'Alex', time: totaltime },

{ 'user': 'Bob', time: totaltime}
我怎么能这样做 这是我的全部代码

let data = await db
.all()
.filter(x => x.ID.startsWith(`total`))
.sort(function (a, b) {
return JSON.parse(b.data).total - JSON.parse(a.data).total;
});
var list = []
var i = 0;
for (i in data) {
liste.push({
user: client.users.cache.get(data[i].ID.split(":")[1]).username,
time: JSON.parse(data[i].data).total
}) 
}

您可以使用reduce和check

var列表=[
{'user':'Tom',时间:270547},
{'user':'Alex',时间:82081},
{'user':'Bob',时间:58702},
{'user':'Tom',时间:53944},
{'user':'Bob',时间:44938},
{“用户”:“鲍勃”,时间:24353}
]
var结果=[];
列表.减少(函数(res,value){
如果(!res[value.user]){
res[value.user]={user:value.user,时间:0};
result.push(res[value.user])
}
res[value.user].time+=value.time;
返回res;
}, {});

控制台日志(结果)您将希望在列表中循环,每次遇到新名称时,您都将为该名称创建一个新对象,并将时间添加到该对象中并将其存储在某个位置。下次找到相同的名称时,将新时间添加到旧时间中,直到完成为止,然后只需再次将所有对象收集到一个数组中

以下是一种方法的代码:

function timeByName(list) {
    const names = {};
    list.forEach(item => {
        const previous = names[item.name] || { name: item.name, time: 0 };
        previous.time += item.time;
        names[item.name] = previous;
    });

    return Object.values(names) 
}
如果实际需要数组而不是对象,可以使用,然后使用将对象转换回数组:

const list=[
{用户:“汤姆”,时间:270547},
{用户:“Alex”,时间:82081},
{用户:“鲍勃”,时间:58702},
{用户:“汤姆”,时间:53944},
{用户:'Bob',时间:44938},
{用户:“鲍勃”,时间:24353}
];
const results=list.reduce((结果、条目)=>{
const userResult=result[entry.user];
if(userResult){
userResult.time+=entry.time;
}否则{
//我们在这里使用扩展运算符来避免对原始值进行变异
//“列表”中的条目:
结果[entry.user]={…entry};
}
返回结果;
}, { });
log('As object=',results);
log('As array=',Object.values(results))
。作为控制台包装器{
最大高度:无!重要;

}
您可以使用javascript reduce方法。这是更多的信息

let list=[
{'user':'Tom',时间:270547},
{'user':'Alex',时间:82081},
{'user':'Bob',时间:58702},
{'user':'Tom',时间:53944},
{'user':'Bob',时间:44938},
{“用户”:“鲍勃”,时间:24353}
]
const usersTime=list.reduce((acc,{user,time})=>{
acc[用户]=(acc[用户]| | 0)+parseInt(时间,10);
返回acc
},{});
const result=Object.keys(usersTime).map(user=>({user:user,time:usersTime[user]}));

console.log(result)
请发布您的代码,以便我们可以帮助您。我更新了我的代码。这不会生成OP需要的输出。这是所有时间的总和。OP想按姓名计算次数。谢谢@jfriend00的建议。我编辑了这个片段,我认为现在是正确的。