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;
}, {});