javascript - 如何从一组对象中创建一个合并对象,该对象保留原始对象中的属性,而不是从新传入的对象中更改
问题描述
我必须对象/数组集...
var test = [{id: 1, prop: 'bill', location: 'san diego'},{id: 11, prop: 'bright'}];
var test2 = [{id: 1, prop: 'casey'},{id: 11, prop: 'candle'}];
最终,我希望 test2 中的对象更改 test 中的属性,但保留原始对象中的 location 属性,因为它没有更改甚至在 test2 中引用。
我所做的是设置一个映射,该键是 id 并使用每个对象作为值。
问题是每个键的新对象的值将完全覆盖以前的原始对象。因此, location 属性会从原始数组中删除。
特别是从 Object.assign() 中,未作为对象数组呈现的裸对象将保留原始对象的完整性,并且只会更改底层属性。
以下是两者的示例:
对象数组:
var o1 = [{id: 1, prop: 'bill', location: 'san diego'},{id: 11, prop: 'bright'}];
var o2 = [{id: 1, prop: 'casey'},{id: 11, prop: 'candle'}];
var o3 = { c: 3 };
var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // 0: {id: 1, prop: "casey"} 1: {id: 11, prop: "candle"} c: 3
单一对象:
var o1 = {id: 1, prop: 'bill', location: 'san diego'};
var o2 = {id: 1, prop: 'casey'};
var o3 = { c: 3 };
var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // {id: 1, prop: "casey", location: "san diego", c: 3}
以单一格式处理对象具有预期的效果,因此答案可能就在这个事实中。是否有一种简洁的方法来执行此操作,或者是否需要以循环方式构建,一次处理一条记录?如果是这样,这将是一个什么例子?
这是我正在处理的映射代码:
var test = [{id: 1, prop: 'bill', location: 'san diego'},{id: 11, prop: 'bright'}];
var first = new Map();
for (const value of test) {
//console.log(key + ' = ' + value.id);
first.set(value.id, value);
//console.log(first);
}
var test2 = [{id: 1, prop: 'casey'},{id: 11, prop: 'candle'}];
var second = new Map();
for (const value of test2) {
second.set(value.id, value);
}
var merged = new Map([...first, ...second]);
let mergedArray = [];
for (var value of merged.values()) {
console.log(' = ' + value);
mergedArray.push(value);
}
console.log('merged', mergedArray);
// console.log(merged)
// console.log('second2', second);
// console.log('first2 ', first);
解决方案
const merged = test.map(ele => {
const found = test2.find(({id}) => id === ele.id) || {}
return {...ele, ...found}
})
- 循环
test
- 在中找到相同的 id 元素
test2
(如果没有找到,则设置一个空对象) - 返回合并的对象,其中
test
是源并test2
包含覆盖/添加
推荐阅读
- python - 我的端口扫描器扫描端口的时间太长。这是我的代码,有人可以帮助我吗?
- java - Hadoop Namenode 将 FSNamesystem 指标发送到具有损坏指标路径的石墨
- reactjs - 如何从 js 文件中删除内容并从反应应用程序中的 xml 文件中呈现它?
- eclipse - Egit:如何在 Eclipse 中的项目工作区中创建一个位于单独文件夹中的 git 存储库?
- r - Shiny R中的 :: NA/NaN 参数出错:比较字符串
- java - SoapUI java API,长值的TestCase.setPropertyValue操作阻塞java程序
- java - 如何跨多个班级使用扫描仪?
- macos - 为 macOS 分发已编译的 Crystal 二进制文件,无需 brew
- python - 如何使用带有“奇怪”字符串格式的 pandas.to_datetime
- python - 自定义执行后执行的方法