如何创建去重重组数组:以DetailValue为键聚合DetailName
问题解决:基于DetailValue去重并聚合DetailName
需求
在不修改原数组的前提下,对每个元素的Details数组做以下处理:
- 按
DetailValue去重 - 将同一
DetailValue对应的DetailName聚合为数组并排序 - 生成以
DetailValue为键、聚合排序后的数组为值的新结构
原数组示例
let arr = [ { Name: 'Name 1', Details: [ { DetailName: 'detail 1', DetailValue: 101 }, { DetailName: 'detail 2', DetailValue: 101 }, { DetailName: 'detail 3', DetailValue: 250 } ] }, // 其他Name & Details... ];
期望输出要求
- 去除
DetailValue的重复值 - 所有
DetailName排序后存入数组 - 以去重后的
DetailValue为键,对应值为聚合排序后的DetailName数组
期望输出结构
[ { Name: 'Name 1', Details: [ { 101: ['detail 1','detail 2'], 250: ['detail 3'] } ] }, // 其他Name & Details... ]
尝试的代码
用户已实现提取去重后的DetailValue,但无法聚合DetailName:
for(let i = 0; i < arr.length; i++){ let deita = arr[i].Details let removeDupsOfDetailValue = Object.keys(deita.reduce((r,{Length}) => (r[Length]=Length, r) , {})) console.log(removeDupsOfDetailValue) }
解决方案
通过map和reduce组合实现需求,全程不修改原数组:
// 生成目标结果数组,原数组保持不变 const processedArr = arr.map(item => { // 构建DetailValue到DetailName数组的映射 const aggregatedDetails = item.Details.reduce((acc, detail) => { const val = detail.DetailValue; // 初始化空数组(若键不存在) if (!acc[val]) { acc[val] = []; } // 添加当前DetailName到对应数组 acc[val].push(detail.DetailName); return acc; }, {}); // 对每个DetailName数组进行排序 Object.keys(aggregatedDetails).forEach(key => { aggregatedDetails[key].sort(); }); // 返回新对象,保留原Name,替换Details为目标结构 return { ...item, Details: [aggregatedDetails] }; }); console.log(processedArr);
代码说明
- 使用
map遍历原数组,每个元素生成新对象,避免修改原数据 - 通过
reduce聚合同一DetailValue的DetailName,利用对象键的唯一性自动去重 - 遍历映射的所有键,对每个
DetailName数组执行排序 - 最终将聚合后的映射放入
Details数组,符合期望的输出结构
内容的提问来源于stack exchange,提问作者Keyboard Corporation
相关产品推荐
相关产品推荐

