更新javascript对象属性?

更新javascript对象属性?,javascript,object,properties,Javascript,Object,Properties,我的结构如下所示: skillet.person = { name: { first: '', last: '' }, age: { current: '' }, birthday: { day: '', month: '', year: '' } } 我想知道如何更新这些值?i、 我认为以下是正确的 skillet.person.name.push({ first: 'blah', last: 'ha'}); 但这

我的结构如下所示:

skillet.person = {
  name: {
    first: '',
    last: ''
  }, 
  age: {
    current: '' 
  },
  birthday: {
    day: '',
    month: '',
    year: ''
  }
}
我想知道如何更新这些值?i、 我认为以下是正确的

skillet.person.name.push({ first: 'blah', last: 'ha'});
但这是错的?我怎样才能解决这个问题

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


push
是一种
Array
s方法,用于向数组中添加新项

如果要替换该值,则:

skillet.person.name = { … };

如果要在对象中存储多个(完整)名称,则需要该属性来保存对象数组而不是单个对象。

如果要将一个对象混合到另一个对象中,可以使用jQuery的deep extend函数。“Deep”表示它不会用新对象覆盖
name
,而是覆盖这样一个对象内部的属性

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

现在,
skillet.person
已更新了相应的属性,而其他属性未被更改。

在最近使用ECMAScript 2015的浏览器上,您可以执行以下操作:

Object.assign(skillet.person.name, { first: 'blah', last: 'ha'});
这将保留未在右侧对象中列出的任何现有属性

参考:

[编辑]使用ES7,您可以做得更短(但是否更清晰?…):


参考资料:

使用ES7+语法和功能方法:

const new_obj = { ...obj, name: { first: 'blah', last: 'ha'} }

正如@ramon diogo用ES7写的那样+

我喜欢更新嵌套值,如:

让用户={
姓名:{
第一个:'约翰',
最后:“史密斯”
},
年龄:18岁,
城市:“纽约”
}
常数年龄=20;
用户={…用户,年龄}
console.log(user.age)
//产出:20
常数新数据={
年龄:22,,
城市:“旧金山”
};
user={…user,…newData}
console.log(user.name.first)
//输出:约翰
console.log(user.age)
//产出:22
console.log(user.city)
//输出:“旧金山”

我认为这更简单

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

    let update = {
        person: {
            name: {
                first: 'blah',
                last : 'ha'
            }
        }
    };

    let result = Object.assign(skillet.person, update.person);

    console.log(result);
最简单的方法

skillset.person.name = {};

这是为对象属性赋值的最简单方法。

谢谢,如果我不想替换,有没有更快的更新方法,而不是列出每个值?@Andy:你可以迭代对象属性<代码>用于(新值中的var prop){oldValues[prop]=newValues[prop];}(在要点中)。MDN也有一个关于中…的
的好页面。看一看,谢谢你的回复。如果不是所有的值都可用,我不想替换属性,那么有没有更快的方法来更新而不是列出每个值呢?@Andy:你可能正在寻找一个
扩展
函数@是的,目前我有一堆属性,但并非所有属性都包含值。我只是用部分属性替换对象,这导致了一个问题-这是否意味着我必须像MrE那样列出每个值,还是有一种不替换的更快方法?@Andy:你有两个属性要混合在一起的对象吗?@pimvdb-我只是喜欢一个有9个属性但通常只更新6个属性的对象是的。我尝试了
{…}
但它将替换3个未填充的VAL-因此这意味着我必须编写6个属性,如
skillet.person.name.first
等?MDN有一个很棒的JavaScript教程,特别是
const new_obj={…obj,name:{first:'blah'}
?我错过了上次的
属性!这样,您就删除了
last
属性。如果您只想更新
first
属性(而不删除
last
属性),您应该执行
const new_obj={…obj,name:{…obj.name,first:'blah'}}
。这是唯一可以应用于任何用例的通用答案。它看起来几乎像昆汀在2012年的答案。是否有任何改进或更改?如果我只需要更新“last”而不影响“first”呢?按照platie的相同示例,我认为只编辑一个元素的最简单方法是这样:。skillet.person.birth.year=2019控制台.log({…skillet.person,…skillet.person.birth.year});
$.extend(true, skillet.person, {
  name: {
    first: 'updated'
  },
  birthday: {
    day: 'updated',
    year: 'updated'
  }
});
skillet.person.name.first = "blah"
skillet.person.name.last = "ha"
skillset.person.name = {};