web-dev-qa-db-ja.com

JavaScriptオブジェクトプロパティを更新しますか?

私は次のような構造を持っています:

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

私はこれらの値をどのように更新するのだろうと思っていましたか?つまり、私は次のとおりでしたが

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

しかし、それは間違っていますか?どうすれば修正できますか?

19
Andy

オブジェクトを別のオブジェクトにミックスしたい場合は、jQueryのディープエクステンド機能を使用できます。 「深い」とは、nameを新しいオブジェクトで上書きするのではなく、そのようなオブジェクト内のプロパティを上書きすることを意味します。

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

今、skillet.personには適切なプロパティが更新されていますが、他のプロパティは変更されていません。

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

または

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

ES7 +構文と機能的アプローチの使用:

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

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

8
Vincent J

Pushは、新しいアイテムを配列に追加するArraysのメソッドです。

値を置き換える場合:

skillet.person.name = { … };

オブジェクトに複数の(完全な)名前を格納する場合、単一のオブジェクトではなくオブジェクトの配列を保持するプロパティが必要になります。

4
Quentin

@ 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.age)
// output: 22
console.log(user.city)
// output: 'san francisco'
0
Emisael Carrera