说我有两个对象:
let obj1 = {
name: 'obj 1',
id: 1,
color: "#fff",
pages: []
}
let obj2 = {
name: 'obj 2',
id: 2,
color: "#ddd"
}
我想编写一个遵循此逻辑“通过obj1循环的函数,如果obj1和obj1具有相同的属性,则用obj2的值更新obj1的属性”
因此结果将返回值obj1:
{
name: 'obj 2',
id: 2,
color: "#ddd",
pages: []
}
自从我无法forEach或映射对象以来,我在处理对象时遇到了一些问题
谢谢!
答案 0 :(得分:1)
您可以使用
var a = [obj1,obj2];
obj1 = Object.assign(...a);
let obj1 = {
name: 'obj 1',
id: 1,
color: "#fff",
pages: []
}
let obj2 = {
name: 'obj 2',
id: 2,
color: "#ddd"
}
var a = [obj1,obj2];
obj1 = Object.assign(...a);
console.log(obj1)
答案 1 :(得分:1)
您的问题意味着您不想将obj2
中不存在的属性从obj1
复制到obj1
。如果不可能这样(即obj2
始终是obj1
的子集),那么Object.assign
确实是最好的方法。
如果obj2
可以具有您不想复制的属性,那么这里是一个简单的for
循环:
for (const prop in obj2) {
if (prop in obj1) {
obj1[prop] = obj2[prop];
}
}
这将迭代对象的所有可枚举属性,包括其原型的“继承”属性。
如果要限制对象的 own 属性,可以使用Object.keys
:
for (const prop of Object.keys(obj2)) {
if (prop in obj1) {
obj1[prop] = obj2[prop];
}
}
请注意,这两种方法都只会复制“正常”属性。 symbols的属性必须通过Object.getOwnPropertySymbols
进行单独处理。
答案 2 :(得分:0)
您可以像这样使用传播:
let obj1 = {
name: 'obj 1',
id: 1,
color: "#fff",
pages: []
}
let obj2 = {
name: 'obj 2',
id: 2,
color: "#ddd"
}
obj1 = { ...obj1, ...obj2 };
console.log(obj1);
(这些属性的顺序可能不正确,因为JavaScript对象的属性是无序的。)
您也可以使用Object.assign
:
let obj1 = {
name: 'obj 1',
id: 1,
color: "#fff",
pages: []
}
let obj2 = {
name: 'obj 2',
id: 2,
color: "#ddd"
}
obj1 = Object.assign(obj1, obj2);
console.log(obj1);
答案 3 :(得分:0)
这可确保obj1
仅从obj2
获取更新,而不从任何新属性获取更新:
let obj1 = {
name: 'obj 1',
id: 1,
color: "#fff",
pages: []
}
let obj2 = {
name: 'obj 2',
id: 2,
color: "#ddd",
somethingElse: 'will not add this'
}
const result = Object.entries(obj1).reduce((a, c) => {
a[c[0]] = obj2[c[0]] !== undefined ? obj2[c[0]] : c[1];
return a;
}, {});
console.log(result);