如何按Name属性对对象数组中的元素进行分组?
按NAME属性分组对象数组的通用实现方案
嘿,这个分组需求其实用JavaScript的reduce方法就能轻松搞定,完全不需要预定义名称列表——我给你写个通用方案,再拆解下逻辑:
完整实现代码
// 你的原始对象数组 const people = [ { NAME: 'Mich', Age: 52, Member: false }, { NAME: 'Sarah', Age: 21, Member: true }, { NAME: 'Sarah', Age: 90, Member: false } ]; // 核心分组逻辑 const groupedByName = people.reduce((acc, currentPerson) => { // 获取当前对象的NAME值作为分组键 const groupKey = currentPerson.NAME; // 如果分组对象中还没有这个键,初始化一个空数组 if (!acc[groupKey]) { acc[groupKey] = []; } // 将当前对象加入对应分组的数组 acc[groupKey].push(currentPerson); // 返回更新后的分组对象,供下一次迭代使用 return acc; }, {}); // 初始值设为空对象,作为分组的容器 // 输出结果就是你想要的格式 console.log(groupedByName);
逻辑拆解
这个方案的核心是利用Array.prototype.reduce()的累加特性:
acc是我们正在构建的分组对象(累加器),初始值是空对象{}currentPerson是遍历到的每一个原始数组元素- 每次迭代时,我们先取出当前元素的
NAME作为分组键,检查分组对象里有没有这个键:- 没有的话就创建一个空数组作为该键的值
- 有的话直接把当前元素推入对应数组
- 最后返回更新后的累加器,直到遍历完所有元素
额外优化建议
- 如果需要忽略
NAME的大小写(比如把'Sarah'和'sarah'分到同一组),可以把分组键改成小写:const groupKey = currentPerson.NAME.toLowerCase(); - 如果不想让分组后的对象和原数组对象共享引用(避免修改原对象影响分组结果),可以用对象展开语法深拷贝:
acc[groupKey].push({...currentPerson}); - 如果你的环境支持ES2022+,也可以用
Object.hasOwn()替代!acc[groupKey]来更安全地检查键是否存在:if (!Object.hasOwn(acc, groupKey))
内容的提问来源于stack exchange,提问作者quo91
相关产品推荐
相关产品推荐

