Javascript 如何计数数组中的重复项并将计数转换为以下格式?
我有一系列的物品Javascript 如何计数数组中的重复项并将计数转换为以下格式?,javascript,Javascript,我有一系列的物品 items = [ {name: 'Thomas', id: '234234', 'job': 'painter'}, {name: 'Jonathan', id: '435123', 'job': 'driver'}, {name: 'Thomas', id: '234234', 'job': 'driver'}, {name: 'Mark', id: '767445', 'job': 'mechanic'}, ] 我想实现的是,我想以以下方式映射重复计数 预期成果结构:
items = [
{name: 'Thomas', id: '234234', 'job': 'painter'},
{name: 'Jonathan', id: '435123', 'job': 'driver'},
{name: 'Thomas', id: '234234', 'job': 'driver'},
{name: 'Mark', id: '767445', 'job': 'mechanic'},
]
我想实现的是,我想以以下方式映射重复计数
预期成果结构:
duplicateCount = {
id: {
name: string;
count: number;
}
}
其中id是来自上述数组(项)的用户id,name是用户的名称,count是重复编号
此处根据id对复制进行计数。
例如:
duplicateCount = {
234234: {
name: 'Thomas',
count: 2,
},
435123: {
name: 'Jonathan',
count: 1,
},
767445: {
name: 'Mark',
count: 1,
},
}
/******* explanation: here take one item ***********/
234234: {
name: 'Thomas',
count: 2,
},
// 234234 is the user id & count is the duplication number.
/***********************************/
// we can ignore other props such as job. only two fields are required.
提出一些想法
更新
对不起,我错过了那一个
更新:此处根据id对复制进行计数。
请更新代码片段。您可以通过
const items = [
{ name: 'Thomas', id: '234234', job: 'painter' },
{ name: 'Jonathan', id: '435123', job: 'driver' },
{ name: 'Thomas', id: '234234', job: 'driver' },
{ name: 'Mark', id: '767445', job: 'mechanic' },
];
const duplicates = items.reduce((acc, item) => {
const { id, name } = item;
acc[id] = acc[id]
? { ...acc[id], count: acc[id].count + 1 }
: { name, count: 1 };
return acc;
}, {});
您可以减少数组并检查
id
是否存在,然后增加计数或分配一个新对象
var items=[{name:'Thomas',id:'234234','job':'painter'},{name:'Jonathan',id:'435123','job':'driver'},{name:'Thomas',id:'234234','job':'driver'},{name:'Mark id:'767445','job':'mechanical'},
计数=项目。减少((r,{name,id})=>{
if(r[id])r[id].count++;
else r[id]={name,count:1};
返回r;
}, {});
控制台日志(计数)代码>您可以使用reduce函数
const项=[
{姓名:'Thomas',id:'234234','job':'painter'},
{name:'Jonathan',id:'435123','job':'driver'},
{name:'Thomas',id:'234234','job':'driver'},
{name:'Mark',id:'767445','job':'mechanical'},
];
const output=items.reduce((acc,{id,name})=>{
acc[id]?acc[id]。计数++:acc[id]={名称,计数:1};
返回acc;
}, {})
console.log(输出)
.as控制台包装{max height:100%!important;top:0;}
您可以使用数组.reduce()执行此操作:
您可以使用
let项目=[
{姓名:'Thomas',id:'234234','job':'painter'},
{name:'Jonathan',id:'435123','job':'driver'},
{name:'Thomas',id:'234234','job':'driver'},
{name:'Mark',id:'767445','job':'mechanical'},
]
让dupCount=项目。减少((acc,项目)=>{
acc[item.id]={name:item.name,计数:acc[item.id]?acc[item.id]。计数+1:1}
返回acc
}, {})
console.log(dupCount)
什么不起作用?您找不到名称不同的相同id,是吗?很抱歉,我错过了那个。复制根据用户id进行计数。如果在解决方案中使用reduce,请解释为什么/通过更简单的循环进行验证。它不适合JavaScript中的这个问题,示例显示使用副作用:只需使用预期依赖副作用的正常循环方法。我建议使用forEach或for,因为reduce不适合副作用(更合理的用例可能是,例如,求和数字)。不确定为什么每个人都建议减少排放量作为最佳解决方案。你有不同的建议吗?我想看看!!为什么使用reduce?为什么使用reduce?你有不同的建议吗?我想看看@用户2864740因为它实现了目标?不知道你在寻找什么样的答案。为什么要使用reduce?因为它与变量是自包含的。而且分离变量的读取复杂性成本“比”警惕reduce执行副作用的成本“更高”(并且必须返回相同的对象修改累加器)?嗯,至少给出了一个理由,即使我不同意。。所以,投票支持一个可能的实现,这与性能无关。这是可维护性的成本。。我工作在大型(和旧的)代码中,所以厌倦了:/Why use reduce?@user2864740我认为reduce将比for循环更具可读性,因为它的意图将清楚地知道reduce将是什么,变量也将被定位到所需的范围,并且它更容易将reduce函数提取到自己的实用函数中。此外,使用reduce链接将更容易,与常规for循环相比有很多好处
let duplicateCount = items.reduce((accumulator, item) => {
let id = item.id;
if (!accumulator.hasOwnProperty(id)) {
accumulator[id] = {
name: item.name,
count: 1
};
} else {
accumulator[id].count++;
}
return accumulator;
}, {});