基于categoryId合并数组对象并整合addons列表
合并相同categoryId的对象并整合addons列表
我有一个对象数组,其中多个对象的categoryId一致,每个对象包含一个addons列表。需求是将具有相同categoryId的对象合并为单个对象,并将所有对应的addons列表整合到该对象的addons中。尝试过map和groupBy方法但未奏效,以下是输入示例与期望的输出示例:
输入示例
[ { "addons": [ { "addonId": "Addon_5035fac357f446fb8b4fcff45d2e36e5", "addonIdentifier": "Gherkin", "addonQuantity": 1, "subTotal": 0.99, "addonType": "EXTRAS" } ], "categoryId": "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303", "categoryIdentifier": "Extra 1" }, { "addons": [ { "addonId": "Addon_700a1458fae54ba9b3e148da709eea4a", "addonIdentifier": "Hash Brown", "addonQuantity": 1, "subTotal": 0.99, "addonType": "EXTRAS" } ], "categoryId": "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303", "categoryIdentifier": "Extra 1" }, { "addons": [ { "addonId": "Addon_f4408295adb14723aa22a3a7e645a7a7", "addonIdentifier": "Cheese", "addonQuantity": 1, "subTotal": 0.99, "addonType": "EXTRAS" } ], "categoryId": "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303", "categoryIdentifier": "Extra 1" } ]
期望输出示例
[{ "addons": [ { "addonId": "Addon_5035fac357f446fb8b4fcff45d2e36e5", "addonIdentifier": "Gherkin", "addonQuantity": 1, "subTotal": 0.99, "addonType": "EXTRAS" }, { "addonId": "Addon_700a1458fae54ba9b3e148da709eea4a", "addonIdentifier": "Hash Brown", "addonQuantity": 1, "subTotal": 0.99, "addonType": "EXTRAS" }, { "addonId": "Addon_f4408295adb14723aa22a3a7e645a7a7", "addonIdentifier": "Cheese", "addonQuantity": 1, "subTotal": 0.99, "addonType": "EXTRAS" } ], "categoryId": "Addon_Cate_1a7bacd1a07b40ceb7d5d3a2229fb303", "categoryIdentifier": "Extra 1"}]
解决方案
原生JavaScript实现
使用reduce方法遍历数组,合并相同categoryId的对象:
const inputArray = // 你的输入数组 const mergedArray = inputArray.reduce((acc, current) => { const existingItem = acc.find(item => item.categoryId === current.categoryId); if (existingItem) { // 合并addons列表 existingItem.addons = [...existingItem.addons, ...current.addons]; } else { // 浅拷贝当前对象加入累加器,避免修改原数组对象 acc.push({ ...current }); } return acc; }, []);
Lodash实现(使用groupBy)
如果项目中已引入Lodash,可以结合groupBy和flatMap实现:
const _ = require('lodash'); const inputArray = // 你的输入数组 // 按categoryId分组 const groupedItems = _.groupBy(inputArray, 'categoryId'); // 转换为合并后的数组 const mergedArray = Object.values(groupedItems).map(group => ({ ...group[0], addons: group.flatMap(item => item.addons) }));
内容的提问来源于stack exchange,提问作者tahreem
相关产品推荐
相关产品推荐

