在Node环境中使用JavaScript按相同键值合并数组
按name键分组数组元素的解决方案
没问题,这个需求在Node.js里用数组的reduce方法就能优雅解决,我给你写个实用的实现:
const myObjOne = [ { "name":"John", "id":1, "car":"maruti" }, { "name":"John", "id":2, "car":"wolks" }, { "name":"John", "id":3, "car":"bmw" }, { "name":"Peter", "id":4, "car":"alto" }, { "name":"Peter", "id":5, "car":"swift" } ]; // 使用reduce进行分组 const grouped = myObjOne.reduce((accumulator, currentItem) => { // 解构出name和剩余属性(id、car) const { name, ...restProps } = currentItem; // 如果累加器中还没有当前name的分组,就初始化一个 if (!accumulator[name]) { accumulator[name] = { name, items: [] }; } // 将当前元素的剩余属性添加到对应分组的items数组中 accumulator[name].items.push(restProps); return accumulator; }, {}); // 将分组后的对象转换为目标数组格式 const myObj = Object.values(grouped); console.log(myObj);
代码逻辑说明:
reduce方法遍历原始数组,用accumulator(累加器)临时存储按name分组的数据,初始值是一个空对象- 每次遍历解构出当前元素的
name和其他属性,避免手动提取id和car,扩展性更好(如果以后加其他属性也不用改代码) - 检查累加器中是否已有当前
name的分组,没有就创建包含name和空items数组的对象 - 将当前元素的剩余属性推入对应分组的
items数组 - 最后用
Object.values()把累加器对象的所有值提取出来,转成你需要的数组格式
运行这段代码后,输出结果和你期望的myObj完全一致,而且这个方案在所有支持ES6+的Node.js版本(目前主流LTS版本都支持)都能正常运行。
内容的提问来源于stack exchange,提问作者Jomol MJ
相关产品推荐
相关产品推荐

