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

如何优化多层嵌套JSON数据分组实现(Lodash或其他方案)

优化JSON多层嵌套分组方案

问题背景

需要将API返回的JSON数据按 fruitType.name → plantedIn.country → harvestMethod.name → product.id 的层级分组转换,原方案用Lodash嵌套groupBy存在冗余且效率偏低,以下是更优实现。

最优实现思路

嵌套groupBy会对数据进行多次遍历(每一层分组都要遍历当前数据集),而使用reduce只需遍历一次原始数组,直接逐层构建层级结构,效率更高且代码更紧凑。

方案1:基于Lodash的优化实现

利用_.reduce一次性完成层级构建,避免多层链式调用的冗余:

// 模拟API返回的原始数据
const fruits = [
  {
    fruitType: { name: "Apple" },
    plantedIn: { country: "USA" },
    harvestMethod: { name: "Mechanical" },
    product: { id: "apple-001" },
    quantity: 100
  },
  {
    fruitType: { name: "Apple" },
    plantedIn: { country: "China" },
    harvestMethod: { name: "Manual" },
    product: { id: "apple-002" },
    quantity: 150
  }
];

const groupedData = _.reduce(fruits, (result, item) => {
  // 逐层获取或创建分组节点
  const fruitGroup = result[item.fruitType.name] || (result[item.fruitType.name] = {});
  const countryGroup = fruitGroup[item.plantedIn.country] || (fruitGroup[item.plantedIn.country] = {});
  const methodGroup = countryGroup[item.harvestMethod.name] || (countryGroup[item.harvestMethod.name] = {});
  
  // 最后一层存储数据(若product.id唯一,可直接赋值item而非数组)
  methodGroup[item.product.id] = [...(methodGroup[item.product.id] || []), item];
  
  return result;
}, {});

方案2:原生JavaScript实现(无依赖)

完全不依赖第三方库,用原生Array.reduce实现,性能最优:

const groupedData = fruits.reduce((result, item) => {
  const fruitName = item.fruitType.name;
  const country = item.plantedIn.country;
  const methodName = item.harvestMethod.name;
  const productId = item.product.id;

  // 逐层初始化分组节点
  if (!result[fruitName]) result[fruitName] = {};
  if (!result[fruitName][country]) result[fruitName][country] = {};
  if (!result[fruitName][country][methodName]) result[fruitName][country][methodName] = {};
  if (!result[fruitName][country][methodName][productId]) {
    result[fruitName][country][methodName][productId] = [];
  }

  result[fruitName][country][methodName][productId].push(item);
  return result;
}, {});

对比原方案的优势

  • 效率更高:仅遍历原始数组1次,而嵌套groupBy需要遍历N次(N为分组层级数)
  • 代码更简洁:避免多层chain和mapValues的嵌套冗余
  • 灵活性更强:可直接修改最后一层的数据存储形式(数组/单个对象)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:33:27