如何根据对象中的id对JSON对象进行分组并添加计数字段
根据ID分组JSON对象并添加计数字段
这是开发里很常见的需求,用JavaScript的Array.reduce()方法就能轻松搞定,我给你一步步拆解实现方式:
实现思路
- 用一个临时对象做累加器,以每个条目的
id作为键,用来存分组后的结果 - 遍历原始数组时,遇到相同
id的条目就给对应条目的qty计数加1 - 碰到新的
id就初始化一个新条目,同时给它加上qty: 1的初始计数 - 最后把累加器里的取值转换成数组,就是我们要的最终输出
完整代码示例
var a = [ {"name":"test","id":101,"price":100}, {"name":"test","id":101,"price":100}, {"name":"test3","id":103,"price":10}, {"name":"test2","id":102,"price":12}, ]; // 用reduce完成分组和计数逻辑 const groupedResult = a.reduce((accumulator, currentItem) => { // 检查当前id是否已经在累加器中存在 if (accumulator[currentItem.id]) { // 存在则计数加1 accumulator[currentItem.id].qty++; } else { // 不存在则创建新条目,复制当前item并添加qty初始值 accumulator[currentItem.id] = {...currentItem, qty: 1}; } return accumulator; }, {}); // 将累加器的对象值转为数组,得到最终结果 const output = Object.values(groupedResult); console.log(output);
运行结果
[ {"name":"test","id":101,"price":100,"qty":2}, {"name":"test3","id":103,"price":10,"qty":1}, {"name":"test2","id":102,"price":12,"qty":1}, ]
补充说明
这里用扩展运算符{...currentItem}做了浅拷贝,能保证原始数组的条目不会被修改。如果你的JSON对象里有嵌套的复杂结构,可能需要用深拷贝(比如JSON.parse(JSON.stringify(currentItem)))来避免引用问题,但对于示例里的简单结构,浅拷贝完全够用。
内容的提问来源于stack exchange,提问作者Pavan K
相关产品推荐
相关产品推荐

