如何将多个对象的值合并为数组对象并补全缺失字段为‘-’
问题描述
我有如下两个JSON对象:
var obj1 = { "name":"rencho", "age":23, "occupation":"SE" } var obj2 = { "name":"manu", "age":23, "country":"india" }
期望得到如下输出:
var result = { "name":["rencho", "manu"], "age":[23, 23], "country":["-", "india"], "occupation": ["SE", "-"], }
我尝试了以下代码片段:
let arrGlobal = [] arrGlobal.push(obj1); arrGlobal.push(obj2); let mergedResult = arrGlobal.reduce(function(r, e) { return Object.keys(e).forEach(function(k) { if(!r[k]) r[k] = [].concat(e[k]) else r[k] = r[k].concat(e[k]) }), r }, {}) console.log(mergedResult);
但该代码无法在JSON对象中输出‘-’,恳请您提供帮助!
解决方案
你的思路方向是对的,但缺少了**为每个对象中不存在的属性补充'-'**的逻辑。我们需要先收集所有对象的所有键,然后遍历每个键和每个对象,判断对象是否包含该键,存在则取对应值,不存在则用'-'填充。
修改后的代码如下:
var obj1 = { "name":"rencho", "age":23, "occupation":"SE" }; var obj2 = { "name":"manu", "age":23, "country":"india" }; const arrGlobal = [obj1, obj2]; // 收集所有唯一的键 const allKeys = [...new Set(arrGlobal.flatMap(obj => Object.keys(obj)))]; const mergedResult = allKeys.reduce((result, key) => { // 遍历每个对象,获取对应值或'-' result[key] = arrGlobal.map(obj => obj.hasOwnProperty(key) ? obj[key] : '-'); return result; }, {}); console.log(mergedResult);
代码解释:
- 收集所有键:通过
flatMap提取每个对象的键,再用Set去重,得到所有需要处理的属性名。 - 构建结果对象:遍历每个键,对每个对象检查是否包含该键——如果有就取对应值,没有就用'-'代替,最终把这些值组成数组作为结果对象中该键的值。
这样就能完美得到你期望的输出啦!
内容的提问来源于stack exchange,提问作者user9777762
相关产品推荐
相关产品推荐

