【问题标题】:Updating javascript object property?更新 javascript 对象属性?
【发布时间】:2012-03-16 07:50:09
【问题描述】:

我的结构如下:

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

我想知道如何更新这些值?即我虽然以下是正确的

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

但这是错误的吗?我该如何解决这个问题?

【问题讨论】:

标签: javascript object properties


【解决方案1】:
skillet.person.name.first = "blah"
skillet.person.name.last = "ha"

或

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

【讨论】:

  • 感谢您的回复。如果不是所有值都可用,如果我不想替换属性,是否有更快的更新方法而不是列出每个值?
  • @Andy:您可能正在寻找extend 函数。 See Underscore.js for an implementation.
  • @pimvdb - 是的,目前我有一堆属性,但并非所有属性都包含值。我只用部分属性替换了对象,这导致了问题 - 这是否意味着我必须像 MrE 一样列出每个值,或者有没有更快的方法而不替换?
  • @Andy:你有两个对象的属性要混合在一起吗?
  • @pimvdb - 我只是有一个具有 9 个属性的对象,但通常只更新其中的 6 个。我尝试了{ ... },但它会替换 3 个未填充的 val - 所以这意味着我必须编写 6 个属性,例如 skillet.person.name.first 等?
【解决方案2】:

push 是Arrays 的一个方法,用于向数组添加新项。

如果要替换该值,则:

skillet.person.name = { … };

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

【讨论】:

  • 谢谢,如果我不想替换,有没有更快的更新方法而不是列出每个值?
  • @Andy:您可以迭代对象属性。 for(var prop in newValues) { oldValues[prop] = newValues[prop];}(要点)。 MDN 也有一个关于for...in 的好页面。看看吧。
【解决方案3】:

如果你想将一个对象混合到另一个对象中,你可以使用 jQuery 的深度扩展功能。 “深”意味着它不会用新对象覆盖name,而是覆盖这样一个对象内部的属性。

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

现在,skillet.person 更新了相应的属性,而其他属性保持不变。

【讨论】:

    【解决方案4】:

    在带有 ECMAScript 2015 的最新浏览器上,您可以:

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

    这将保留未在正确对象中列出的任何现有属性。

    参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign

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

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

    参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

    【讨论】:

    • 二选有细微差别,二选不会保留属性(即函数)。
    【解决方案5】:

    使用 ES7+ 语法和函数式方法:

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

    【讨论】:

    • const new_obj = { ...obj, name: { first: 'blah'} } 呢?我错过了last 属性!
    • 这样,您将删除 last 属性。如果您只想更新first 属性(而不删除last 属性),您应该执行const new_obj = { ...obj, name: { ...obj.name, first: 'blah'} }。
    【解决方案6】:

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

    我喜欢更新嵌套值,例如:

    let user = {
        name: {
            first: 'john',
            last: 'smith'
        },
        age: 18,
        city: 'new york'
    }
    
    const age = 20;
    
    user = {...user, age}
    
    console.log(user.age)
    // output: 20
    
    
    const newData ={
        age: 22,
        city: 'san francisco'
    };
    
    user = {...user,...newData}
    
    console.log(user.name.first)
    // output: john
    console.log(user.age)
    // output: 22
    console.log(user.city)
    // output: 'san francisco'
    

    【讨论】:

    • 这是唯一适用于任何用例的通用答案
    【解决方案7】:

    我觉得这样比较简单

         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);
    

    【讨论】:

    • 如果我只需要更新“last”而不影响“first”怎么办?
    • 按照与 platie 相同的示例,我认为只编辑一个元素的最简单方法是这样:. . Skillet.person.birthday.year = 2019 console.log({...skillet.person, ...skillet.person.birthday.year});
    【解决方案8】:
    skillet.person.name.first = "blah"
    skillet.person.name.last = "ha"
    

    最简单的方法。

    【讨论】:

      【解决方案9】:
      skillset.person.name = {};
      

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

      【讨论】:

      • 看起来和昆汀 2012 年的回答差不多,有什么改进或变化吗?
      猜你喜欢
      • 2016-07-13
      • 2019-05-02
      • 2021-08-12
      • 2016-12-19
      • 1970-01-01
      • 2013-01-18
      • 2012-09-14
      • 1970-01-01
      • 2020-07-16
      相关资源
      最近更新 更多