如何优化多层嵌套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
相关产品推荐
相关产品推荐

