2017-04-05 56 views
0

假设我有这样的对象用户。如何在对象中指定项目的位置

const user = { 
    nationality: 'Italian', 
    age: 24, 
    name: { 
     firstName: 'rocky', 
     lastName: 'balboa', 
    }, 
    }; 

我更新了namefirstName项目。我想把这个改变传递给一些函数,这样它也可以更新它自己的具有相同结构的用户对象中的firstName。什么是最好的方式来做到这一点?

根据我的理解,要指定firstName,我们将使用user[name][firstName]。但是,如何将其发送给另一个对象,比如primeUsers,以便它可以更新自己呢?

const primeUser = { 
    nationality: 'Italian', 
    age: 24, 
    name: { 
     firstName: 'rocky', 
     lastName: 'balboa', 
    }, 
    }; 

一种方法是发送“水平”的数组。所以我会送一个数组

const levels = ["name", "firstName"]; 

,但我不知道如何我会使用它来更新primeUserfirstName?对不起,这似乎很奇怪,我不是很清楚地解释它。希望你明白我想要实现:)

+0

'const'关键字不允许修改的对象:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const 。你应该使用'let'或'var' – cl3m

+0

用户和PrimeUser有相同的结构吗? –

+0

@ cl3m'const'允许您更新对象键。 –

回答

1

使用JavaScript 吸气/二传手功能:

得到语法绑定的对象属性,这将是 调用的函数当那个财产被抬起时。


设置语法结合的对象属性的函数被调用 当不存在要设置该属性的尝试。

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

+0

虽然我明白你只是回复帖子,我觉得有趣的是不要提他可以简单地使用参考。从我看到的数据来看,不需要维护2个结构,以防从相同的来源获得完全相同的数据 – Icepickle

1

我想传达这种变化给一些功能,所以它也可以用相同的结构也

它自己的用户对象更新 的firstName

您可以定义在firstName属性的设置,并通过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

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);
.as-console-wrapper { max-height: 100% !important; top: 0; }

随着空对象发生器,以及。

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);
.as-console-wrapper { max-height: 100% !important; top: 0; }

相关问题