2012-02-26 134 views
10

我有如下所示的结构:更新JavaScript对象属性?

skillet.person = { 
    name: { 
    first: '', 
    last: '' 
    }, 
    age: { 
    current: '' 
    }, 
    birthday: { 
    day: '', 
    month: '', 
    year: '' 
    } 
} 

我不知道我怎么会更新这些值?即我虽然以下是正确的

skillet.person.name.push({ first: 'blah', last: 'ha'}); 

但它是错的?我怎样才能解决这个问题 ?

+4

MDN有很大的JavaScript教程,为应对特别是https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects – 2012-02-26 16:45:20

回答

15

如果你想混合一个对象到另一个,你可以使用jQuery的深度扩展函数。 “深”意味着它不会用新对象覆盖name,而是覆盖此类对象内的属性。

$.extend(true, skillet.person, { 
    name: { 
    first: 'updated' 
    }, 
    birthday: { 
    day: 'updated', 
    year: 'updated' 
    } 
}); 

现在,skillet.person已更新适当的属性,而其他属性未触及。

+0

是的!非常感谢:)这就是我一直在寻找的 – Andy 2012-02-26 16:58:08

13
skillet.person.name.first = "blah" 
skillet.person.name.last = "ha" 

skillet.person.name = {first : "blah", last : "ha"} 
+0

感谢。有没有更快的方式来更新,而不是列出每个值,如果我不想更换属性,如果不是所有的值都可用? – Andy 2012-02-26 16:39:27

+1

@Andy:你可能正在寻找一个'extend'函数。 [见Underscore.js的实现。](http://documentcloud.github.com/underscore/#extend) – pimvdb 2012-02-26 16:43:23

+0

@pimvdb - 是的,此刻我有一堆属性,但不是全都包含值。我只用局部特性替换了这个对象,并且导致了一个概率 - 这是否意味着我必须列出像MrE所做的每个值,还是有更快的方法而不替换? – Andy 2012-02-26 16:45:10

4

pushArray秒的方法,增加了一个新的项的阵列。

如果要然后替换值:如果你想多(全)名称存储在对象

skillet.person.name = { … }; 

,那么你需要的属性来保存对象的数组,而不是单个对象。

+0

谢谢有更快的方式更新,而不是列出每个值,如果我不想更换? – Andy 2012-02-26 16:37:49

+2

@Andy:你可以遍历对象属性。 'for(var newValues){oldValues [prop] = newValues [prop];}'(在要点中)。 MDN也有一个关于'for ... in'的好页面。看看它。 – 2012-02-26 16:45:40