如何合并两个数组并使用新值覆盖旧属性值
问题分析
你遇到的核心问题是:原有的unique方法通过===比较对象,但两个不同的对象即使内容完全一致,它们的引用也是不同的,所以这个方法根本识别不出你想要的“重复键”情况。你的需求其实不是简单的数组去重,而是根据对象中的键名(比如Fields-0),用新数组里的对应键值覆盖原数组的旧值,同时保留其他未被覆盖的键值对。
解决方案
我们可以先把两个数组合并,然后将所有对象的键值对整合到一个临时对象中(新的键值会自动覆盖旧的),最后再把这个临时对象转换回数组形式。这样就能完美实现你想要的效果:
// 你的输入数组 const newArray = [ {"Fields-0": false} ]; const currentArray = [ {"Fields-0": true}, {"Fields-1": true} ]; // 合并并处理的逻辑 const mergedObj = {}; // 先遍历当前数组,把所有键值对存入mergedObj currentArray.forEach(item => { const key = Object.keys(item)[0]; // 因为每个对象只有一个键 mergedObj[key] = item[key]; }); // 再遍历新数组,覆盖同名键的值 newArray.forEach(item => { const key = Object.keys(item)[0]; mergedObj[key] = item[key]; }); // 把mergedObj转换回目标数组格式 const result = Object.entries(mergedObj).map(([key, value]) => ({ [key]: value })); console.log(result); // 输出:[ {"Fields-0": false}, {"Fields-1": true} ]
代码解释
- 创建临时对象
mergedObj:用来存储所有键值对,利用对象键的唯一性实现覆盖。 - 遍历当前数组:先把原数组的所有键值对存入临时对象,这一步是保留原有的未被覆盖的内容。
- 遍历新数组:用新数组的键值对覆盖临时对象中的同名键,实现更新。
- 转换回数组:通过
Object.entries把对象转成键值对数组,再用map转换成你需要的单个对象组成的数组格式。
更通用的版本(如果对象有多个键)
如果你的对象可能包含多个键,我们可以调整逻辑,让新数组的对象完全覆盖原数组中匹配特定标识的对象。比如假设每个对象都有一个唯一标识键(如fieldId),可以修改遍历逻辑来精准覆盖,但你的场景里每个对象只有一个Fields-n键,上面的代码已经完全适用。
内容的提问来源于stack exchange,提问作者test
相关产品推荐
相关产品推荐

