2016-12-27 5 views
0

私のredux reducerのObject.assignを使用してオブジェクトの内部要素を更新するには少し助けが必要です。Object.assignを使用してオブジェクトの内部要素を更新する

シナリオをより詳しく説明するために、私はNBAチームを使用しています。私はreduxストアにNBAオブジェクトを持っています。私は現在、特定のチームのteamMembersだけを更新しようとしています。私のNBAのオブジェクトは、次のようになります。

{ 
    teams: [ 
     { 
      teamId: 123, 
      teamName: "Los Angeles Lakers" 
      teamMembers: [ 
      {id: "kbryant", fullName: "Kobe Bryant"}, 
      {id: "bingram", fullName: "Brandon Ingram"} 
      ] 
     }, 
     { 
      teamId: 234, 
      teamName: "Miami Heat" 
      teamMembers: [ 
      {id: "cbosh", fullName: "Chris Bosh"}, 
      {id: "tjohnson", fullName: "Tyler Johnson"} 
      ] 
     } 
    ] 
} 

私は私の行動、すなわちaction.teamIdとaction.membersを通じて減速にteamIdとメンバーの両方を渡します。

これは私がこれまで持っているものです。

Object.assign({}, state, { 
    nba: Object.assign({}, state.nba, { 
     teams: Object.assign({}, state.nba.teams, { 
     teamId[action.teamId] // I'm stuck here... 
     }) 
    }) 
}) 

は、どのように私は特定のチームのteamMembersを更新していますか?私はほとんどそこにいるが、少し助けを使うことができることを知っている。ありがとう。

+1

[reduxストアでネストされたデータを更新中]の複製があります。(http://stackoverflow.com/questions/32135779/updating-nested-data-in-redux-store) –

+0

重複していません。また、その質問の提案は適用されません。私はObject.assignのみを使用しています。 – Sam

+0

関連する 'Object.assign'呼び出しを[IIFE](http://benalman.com/news/2010/11/immediately-invoked-function-expression/)にラップし、そこにいくつかの作業を行うことができます。任意のデータ突然変異。 'Object.assign()'によって作成された新しいオブジェクトを変更して '返す 'ことを確認してください。 –

答えて

1

teams配列内のどの項目を更新する必要があるのか​​を識別するための動的インデックスプロパティでコードを拡張することができます。 ES6構文では、ダイナミック式を角括弧で囲んで、{ [index]: value }のようにオブジェクトリテラルの動的プロパティを使用できます。indexは変数またはその他の式です。この種の操作がImmutableのようなライブラリと非常に簡単になるという

function getNewState(state, action) { 
 
    var index = state.nba.teams.findIndex(t => t.teamId == action.teamId); 
 
    if (index == -1) return state; // team not found 
 
    return Object.assign({}, state, { 
 
     nba: Object.assign({}, state.nba, { 
 
      teams: Object.assign([], state.nba.teams, { 
 
       [index]: Object.assign({}, state.nba.teams[index], { 
 
        teamMembers: action.teamMembers 
 
       }) 
 
      }) 
 
     }) 
 
    }); 
 
} 
 

 
var state = { 
 
    nba: { 
 
     teams: [{ 
 
      teamId: 123, 
 
      teamName: "Los Angeles Lakers", 
 
      teamMembers: [ 
 
       {id: "kbryant", fullName: "Kobe Bryant"}, 
 
       {id: "bingram", fullName: "Brandon Ingram"} 
 
      ] 
 
     }, { 
 
      teamId: 234, 
 
      teamName: "Miami Heat", 
 
      teamMembers: [ 
 
       {id: "cbosh", fullName: "Chris Bosh"}, 
 
       {id: "tjohnson", fullName: "Tyler Johnson"} 
 
      ] 
 
     }] 
 
    } 
 
}; 
 

 
var action = { teamId: 123, teamMembers: [{id: "lnance", fullName: "Larry Nance"}] }; 
 
var newState = getNewState(state, action); 
 
console.log(newState);
.as-console-wrapper { max-height: 100% !important; top: 0; }

注:

はここで最終的な解決策です。

+0

これはかなり良い解決策だと思います。つまり、インデックスを見つけて値を更新します。それを働かせるにはまだ時間がかかりました。私はObject.assignを使用しているので、チームメンバーを配列からオブジェクトに変換して、残りのコードを壊してしまった。 Object.assignを使用してteamMembersの新しいコピーを作成する代わりに、代わりにsliceを使用して正常に動作しました。私は不変のライブラリを調べます。ありがとう。 – Sam

+0

うまくいきました。私は 'Object.assign'もうまくいくはずだと思いますが、空の配列を最初の引数として提供することで、常に配列であることを確認しています:' Object.assign([]、...) '。今更新しました。しかし、スライスも当然です。 – trincot

+0

Object.assignを空の配列で使用できるかどうかはわかりませんでした。ちょうどもう一つ学んだ。あなたはスーパーに役立ってきました。心から感謝する!あなたの答えをアップにします。 – Sam

関連する問題