假设我有一个像这样的对象用户。
const user = {
nationality: 'Italian',
age: 24,
name: {
firstName: 'rocky',
lastName: 'balboa',
},
};
我更新了firstName
中的name
项。我想将此更改传达给某个函数,因此它也可以使用相同的结构更新它自己的用户对象中的firstName。最好的方法是什么?
根据我的理解,要指定firstName,我们将使用user[name][firstName]
。但是我如何将它发送到另一个对象,让我们说primeUsers
所以它也可以更新自己?
const primeUser = {
nationality: 'Italian',
age: 24,
name: {
firstName: 'rocky',
lastName: 'balboa',
},
};
一种方法是发送“级别”数组。所以我会发送一个数组
const levels = ["name", "firstName"];
但我不确定如何使用它来更新firstName
中的primeUser
?我很抱歉看起来很奇怪,我不是很清楚地解释它。希望你明白我想要实现的目标:)
答案 0 :(得分:1)
使用Javascript getter / setter 功能:
get 语法将对象属性绑定到将要执行的函数 查找该属性时调用。
set 语法将对象属性绑定到要调用的函数 当试图设置该属性时。
const primeUser = {
nationality: 'Italian',
age: 24,
name: {
get firstName() {
return this._firstName;
},
set firstName(fName) {
this._firstName = fName;
},
lastName: 'balboa',
},
};
const user = {
nationality: 'Italian',
age: 24,
name: {
get firstName() {
return this._firstName;
},
set firstName(fName) {
this._firstName = fName;
primeUser.name.firstName = fName;
},
lastName: 'balboa',
},
};
user.name.firstName = 'rocky';
console.log(primeUser.name.firstName);

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/set
答案 1 :(得分:1)
我想将此更改传达给某个功能,以便它也可以更新 firstName在它自己的用户对象中也具有相同的结构
您可以在firstName
属性上定义一个setter,并将setter函数作为您自己的函数传递,每次此属性更改时都会调用该函数
<强>演示强>
const user = {
nationality: 'Italian',
age: 24,
name: {
firstName: 'rocky',
lastName: 'balboa',
},
};
function yourFunction(val) {console.log("value set ",val)}
Object.defineProperty(user.name, "firstName" ,{set: yourFunction});
user.name.firstName = 1
&#13;
答案 2 :(得分:0)
您可以迭代所有属性并更新不同的值。
它适用于源和目标对象的任何相同结构。如果找到的属性是可迭代对象,则使用源对象和目标对象的实际属性进行递归函数调用。
function update(source, target) {
Object.keys(source).forEach(function (k) {
if (source[k] && typeof source[k] === 'object') {
update(source[k], target[k]);
return;
}
if (target[k] !== source[k]) {
target[k] = source[k];
}
});
}
const user = { nationality: 'Italian', age: 24, name: { firstName: 'rocky', lastName: 'foo' } };
const primeUser = { nationality: 'Italian', age: 24, name: { firstName: 'rocky', lastName: 'balboa' } };
update(user, primeUser);
console.log(primeUser);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
还有空对象的生成器。
function update(source, target) {
Object.keys(source).forEach(function (k) {
if (source[k] && typeof source[k] === 'object') {
update(source[k], target[k] = target[k] || {});
return;
}
if (target[k] !== source[k]) {
target[k] = source[k];
}
});
}
const user = { nationality: 'Italian', age: 24, name: { firstName: 'rocky', lastName: 'balboa' } };
const primeUser = { };
update(user, primeUser);
console.log(primeUser);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;