JavaScript中按唯一ID合并嵌套数组,处理动态键与dummy匹配规则
合并带唯一ID的对象数组并处理dummy字段
我是JavaScript初学者,需要合并一组包含唯一id的对象数组,需求如下:
- A、B这类键是动态的,后续可能添加C、D等新键
dummy字段规则:仅当所有数组中对应id的dummy值完全匹配时,最终结果才保留该值,否则显示为-(连字符)
示例输入
let arr1 = [ { A: 0.71, B: 0.52, id: 1, dummy: 1, }, { A: 0.72, B: 0.50, id: 2, dummy: 1, }, ]; let arr2 = [ { A: 0.157, B: 0.02255, id: 1, dummy: 1, }, { A: 0.16761, B: 0.028281, id: 2, dummy: 1, }, ]; let arr3 = [ { A: 0.55, B: 0.50, id: 1, dummy: 1, }, { A: 0.5, B: 0.43, id: 2, dummy: 1, }, ];
期望输出
let finalArr = [ { id: 1, dummy: 1, arr1_A: 0.71, arr1_B: 0.52, arr2_A: 0.157, arr2_B: 0.02255, arr3_A: 0.55, arr3_B: 0.5, }, { id: 2, dummy: 1, arr1_A: 0.72, arr1_B: 0.5, arr2_A: 0.16761, arr2_B: 0.028281, arr3_A: 0.5, arr3_B: 0.43, }, ];
实现代码
下面是针对需求的实现代码,注释说明了每一步的作用:
// 把所有输入数组和对应的名称存到一个数组里,方便批量处理 const arrays = [ { name: 'arr1', data: arr1 }, { name: 'arr2', data: arr2 }, { name: 'arr3', data: arr3 } ]; // 用对象按id分组存储数据,同一id的所有数据会被整合到一起 const groupedData = {}; // 遍历每个输入数组 arrays.forEach(({ name, data }) => { // 遍历数组内的每个对象 data.forEach(item => { const { id, dummy, ...dynamicKeys } = item; // 如果当前id未被初始化,先创建基础结构 if (!groupedData[id]) { groupedData[id] = { id, dummyValues: [] }; } // 收集当前id对应的所有dummy值,用于后续判断是否一致 groupedData[id].dummyValues.push(dummy); // 遍历动态键(A、B等),重命名为「数组名_键名」的格式并存入 Object.entries(dynamicKeys).forEach(([key, value]) => { groupedData[id][`${name}_${key}`] = value; }); }); }); // 将分组后的对象转为数组,同时处理dummy字段的规则 const finalArr = Object.values(groupedData).map(item => { const { dummyValues, ...rest } = item; // 判断所有dummy值是否完全一致 const allDummyMatch = dummyValues.every(val => val === dummyValues[0]); return { ...rest, dummy: allDummyMatch ? dummyValues[0] : '-' }; }); console.log(finalArr);
代码说明
- 分组整合:通过对象按
id分组,把同一id的所有数据集中,避免重复处理 - 动态键处理:用
Object.entries遍历非id、非dummy的字段,自动适配后续新增的C、D等键 - dummy字段校验:用
every方法判断同一id的所有dummy值是否相同,按规则设置最终值 - 格式转换:最后把分组对象转为数组,得到符合要求的结构
内容的提问来源于stack exchange,提问作者JSG
相关产品推荐
相关产品推荐

