2016-03-30 6 views
0

は、私はこのようなidでマップされた状態にupdates APIレスポンスシンプルSEARCH_SUCCESS減速持っている:私の状態はidでマップされているため

[searchActionTypes.SEARCH_SUCCESS]: (state, { companies }) => { 
    return update(state, { $merge: _.indexBy(companies, '_id') }) 
}, 

をしかし、この状態で既存の企業を置き換えるです。これは問題です。なぜなら、状態の既存の企業に保存されている余分なデータを保存したいからです。

私はちょうど会社を反復処理でき、手動$merge状態:

const newState = _.deepClone(state) 
_.forEach(companies, company => newState[company._id] = state[company._id] ? 
    update(state[company._id], { $merge: company }) : company 
) 
return newState 

しかし、これは不格好な感じ。キーが存在しない場合、条件付きで$mergeまたは$setの入れ子状態を更新するよりエレガントな方法はありますか?

+0

関連:https://でのstackoverflow .com/questions/32135779/updating-nested-data-in-redux-store。 https://github.com/gaearon/normalizrも参照してください。 –

+0

あなたがリンクしている質問は、reactx-addons-updateを使用することを推奨する受け入れられた回答でreduxの状態を更新するという一般的な質問です。私はすでにこのヘルパーを使用して、私の質問でそれにリンクしています。 Abramov(reduxの創造者)もノーマライザーに反応して推奨します。私のデータはすでに正規化されているので、なぜIDでレコードをインデックスしているのですか? –

+0

明確にするために、私の質問は、アドオン$マージ演算子の更新の欠点に対処しています。それは、lodashの割り当てと同じように、浅いマージだけです。 –

答えて

1

は、いくつかのあいた後、私はちょうどassignをlodashと本質的に同等であるため、更新$mergeオペレータを放棄し、このようなlodash cloneDeepmergeのコンボと一緒に行きました:

[dupeSearchActionTypes.SEARCH_SUCCESS]: (state, { companies }) => { 
    // manually _.merge companies into state because react-addons-update $merge is shallow 
    return _.merge(_.cloneDeep(state), _.indexBy(companies, '_id')) 
}, 
関連する問題