You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:15:28