2017-04-05 6 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

userと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プロパティのセッターを定義し、毎回このプロパティが変更さ呼び出されます、あなた自身のようにセッター関数を渡すことができ

デモ

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

関連する問題