Node.js中合并两个数组对象失败,寻求正确实现方案
问题分析与解决方案
你的问题核心在于函数逻辑和输入类型不匹配:你编写的json_concat是针对对象的键值对合并逻辑,但传入的却是数组,导致遍历索引时只是替换了原数组的元素,而非追加新元素,自然得不到预期的合并结果。
为什么原代码不生效?
来看你函数里的核心逻辑:
for (var key in o2) { o1[key] = o2[key]; }
当o2是数组时,key对应的是数组的索引(0、1、2),这段代码相当于把o1[0]替换成o2[0],o1[1]替换成o2[1]……最终o1的长度还是3,没有新增任何元素,和你想要的追加合并完全不是一回事。
正确的实现方式
数组合并有非常简洁的原生方法,如果你需要保持异步Promise的形式,这里提供几种实用方案:
方案1:使用数组原生concat方法(推荐,不修改原数组)
concat会返回一个全新的数组,包含两个输入数组的所有元素,不会改变原数组的数据:
var json_concat = async (arr1, arr2) => { return new Promise((resolve, reject) => { try { const mergedArray = arr1.concat(arr2); resolve(mergedArray); } catch (e) { reject(e); } }); }
方案2:使用ES6扩展运算符(更简洁)
扩展运算符可以快速展开数组元素,轻松构建合并后的新数组:
var json_concat = async (arr1, arr2) => { return new Promise((resolve, reject) => { try { const mergedArray = [...arr1, ...arr2]; resolve(mergedArray); } catch (e) { reject(e); } }); }
方案3:修改原数组(不推荐,会改变输入数组)
如果你一定要修改原数组arr1,可以用push配合扩展运算符把arr2的所有元素追加到arr1末尾:
var json_concat = async (arr1, arr2) => { return new Promise((resolve, reject) => { try { arr1.push(...arr2); resolve(arr1); } catch (e) { reject(e); } }); }
测试调用
不管用哪种方案,调用方式都是一致的:
var a = [{a:1}, {b:2}, {c:3} ]; var b = [{a:1}, {b:2}, {c:3} ]; json_concat(a, b).then(c => { console.log(c); // 输出预期结果:[{a:1}, {b:2}, {c:3}, {a:1}, {b:2}, {c:3}] });
额外提示
如果你的场景没有异步操作的需求,其实完全不需要把数组合并包成Promise,直接用a.concat(b)或者[...a, ...b]就能得到你想要的合并数组,高效又简洁。
内容的提问来源于stack exchange,提问作者CoCo
相关产品推荐
相关产品推荐

