JavaScript按索引合并两个数组并合并同位置对象属性的实现问题
问题核心缺陷说明
你原有代码的问题有两处:
JSON.stringify()没有传入待对比的array1[i]和array2[i]参数,因此对比结果永远相等,导致同索引双对象场景下永远不会推入array1[i]- 缺少对象合并的逻辑,只做了是否推入
array1[i]的判断,没有实现属性合并的需求
修改后代码
let array1 = ["a", "b", {p2: 'goodbye'},"c", "d"], array2 = [1, 2, {p1: 'hello'}], result = [], i, l = Math.min(array1.length, array2.length); for (i = 0; i < l; i++) { const item1 = array1[i] const item2 = array2[i] // 新增null判断,避免typeof null === 'object'的原生语法坑 if (typeof item1 === 'object' && typeof item2 === 'object' && item1 !== null && item2 !== null) { // 序列化对比两个对象属性是否完全相等 const isObjEqual = JSON.stringify(item1) === JSON.stringify(item2) if (isObjEqual) { // 属性完全一致仅保留array2的对象 result.push(item2) } else { // 属性不一致合并两个对象,array2属性优先级更高,重名会覆盖array1的属性 result.push({...item1, ...item2}) } } else { result.push(item2, item1); } } result.push(...array1.slice(l), ...array2.slice(l)); console.log(result);
逻辑说明
- 同索引双对象场景下,先通过序列化对比判断属性是否完全一致,相等仅推入array2的对象,不等则合并属性后推入
- 其余逻辑与原需求保持一致:非对象类型按
array2[i]、array1[i]顺序推入,超出最小长度的剩余元素追加到结果末尾 - 如果你需要支持多层嵌套对象的合并和对比,可以把序列化对比替换为深对比方法,展开替换为深合并逻辑,当前代码适用于单层对象的常见场景
测试效果
针对你给出的测试输入:array1 = ["a", "b", {p2: 'goodbye'},"c", "d"]array2 = [1, 2, {p1: 'hello'}]
运行后输出为:[1, 'a', 2, 'b', {p1: 'hello', p2: 'goodbye'}, 'c', 'd']
完全符合预期需求。
内容的提问来源于stack exchange,提问作者KeyGy
相关产品推荐
相关产品推荐

