如何合并具有相同label键值的JSON对象并剔除冗余null值
同label JSON对象合并实现方案
问题说明
你当前的代码仅实现了同label条目的去重,未完成同label下其他字段的合并、null值过滤逻辑,另外你给出的期望输出存在JSON语法错误:多个值需要放在数组中,合法的dd1多值写法为"dd1": ["Cat A", "Cat B"]。
实现思路
- 以
label值为键建立临时映射表,相比每次遍历结果数组查找匹配条目效率更高 - 遍历原始数据时,若label不存在映射表中则初始化条目,所有非null字段初始化为数组格式存储值
- 若label已存在,遍历当前条目的非label字段,跳过null值后将字段值追加到对应字段的数组中
- 最终将映射表的value集合转为数组即可,若不需要数组格式也可以根据需求将多个值拼接为字符串
可用TS代码实现
// 原始数据示例 const rawData = [ { "label": "Medium", "dd1": "Cat A", "dd2": "Non Cision", }, { "label": "Medium", "dd1": "Cat B", "dd2": null, }, { "label": "Tone", "dd1": "Neutral", "dd2": null, } ] const labelMap: Record<string, any> = {} rawData.forEach(item => { const label = item.label // 跳过label非字符串的条目 if (typeof label !== 'string') return // 该label未初始化过 if (!labelMap[label]) { labelMap[label] = { label } // 初始化其他字段,过滤null值,值存为数组方便后续追加 Object.keys(item).forEach(key => { if (key === 'label') return const val = item[key] if (val !== null) { labelMap[label][key] = [val] } else { labelMap[label][key] = null } }) return } // label已存在,合并字段 Object.keys(item).forEach(key => { if (key === 'label') return const val = item[key] // 跳过null值 if (val === null) return // 字段之前是null的话先初始化为数组 if (labelMap[label][key] === null) { labelMap[label][key] = [] } // 追加值,可新增去重逻辑避免重复值:先判断是否已存在再执行push labelMap[label][key].push(val) }) }) // 映射表转结果数组 const output = Object.values(labelMap) console.log(output)
输出结果(合法JSON格式)
[ { "label": "Medium", "dd1": ["Cat A", "Cat B"], "dd2": ["Non Cision"] }, { "label": "Tone", "dd1": ["Neutral"], "dd2": null } ]
如果你不需要数组格式,想要单值直接返回字符串、多值返回拼接字符串,可以在最后转换数组的时候增加对应处理逻辑即可。
内容的提问来源于stack exchange,提问作者kate moss
相关产品推荐
相关产品推荐

