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

如何将JS对象数组按gridid和UtilName分组生成嵌套对象

JS数组两层分组实现方案

你可以直接用原生Array.reduce方法实现两层分组逻辑,无额外依赖,运行效率高。

严格匹配示例结构的实现

下面的代码输出结构和你给出的示例完全一致:

const newArr = data.reduce((gridGroup, currentItem) => {
  // 解构取出分组键,剩余字段就是需要存入分组的人员信息
  const { gridid, UtilName, ...userInfo } = currentItem;

  // 查找/初始化gridid一级分组
  let targetGridItem = gridGroup.find(item => Object.hasOwn(item, gridid));
  if (!targetGridItem) {
    targetGridItem = { [gridid]: [{}] };
    gridGroup.push(targetGridItem);
  }
  const utilCollection = targetGridItem[gridid][0];

  // 查找/初始化UtilName二级分组
  if (!utilCollection[UtilName]) {
    utilCollection[UtilName] = [];
  }
  // 数据入组
  utilCollection[UtilName].push(userInfo);

  return gridGroup;
}, []);

注:你给出的目标示例里漏归了FirstName: "ERNEST"的Fiber类目数据,上述代码会把所有原数据正确归类,不会出现漏项。如果你需要调整字段格式(比如把FirstName统一为首字母大写其余小写),可以在push数据前单独处理userInfo里的对应字段即可。


更易使用的等效优化结构

如果没有强制要求和示例结构完全一致,更推荐用下面的写法生成扁平化键值对结构,后续取数不需要遍历查找,直接按键就能拿到对应分组:

// 输出结构:{ [gridid]: { [UtilName]: [人员信息数组] } }
const groupedData = data.reduce((result, item) => {
  const { gridid, UtilName, ...userInfo } = item;
  // 初始化一级分组
  if (!result[gridid]) result[gridid] = {};
  // 初始化二级分组
  if (!result[gridid][UtilName]) result[gridid][UtilName] = [];
  result[gridid][UtilName].push(userInfo);
  return result;
}, {});

比如要取570网格下Cable类目的人员列表,直接写groupedData[570].Cable就能拿到,比示例结构的取数逻辑简单很多。

内容的提问来源于stack exchange,提问作者Matt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 01:33:20