2017-06-06 18 views
0

私はlodashとredux/reactを使って簡単なアプリを作っています。今は、複数のオブジェクトを持つオブジェクトを返しています。だから、私は最終的なオブジェクトを得るとき、このようなものに見えます。ロダッシュを使用して、複数のオブジェクトでオブジェクトを更新しようとしています。 (編集項目)

オブジェクト{2:オブジェクト、34:オブジェクト}

各オブジェクトは、タイトル、ID、説明を有します。私はmapKeysにロダッシュを使用して、単一のオブジェクト内の各オブジェクトをIDでキー入力するようにしました。このようにして、各オブジェクトを見つける方が簡単です。例えば、Mainobject [34]はオブジェクト内で2番目であってもそのオブジェクトを返します。

これですべてがうまくいきました。オブジェクトを更新したり、コードを編集して切り抜きオブジェクトの1つを置き換えたいと考えています。私はredux/reactを使用しているので、これを理解することが私のやりたいことを理解するために必要となります。

私は、_.getを使用してmainObjectから項目を見つけて、その特定の項目を_.mergeで更新しようとしていますが、_.updateを使用しようとしていますが、私は、コンソールでこれを取得しています私の現在の状態のはconsole.log:

現在の状態は次のとおりです。 - >オブジェクト{2:オブジェクト、34:オブジェクト}

現在の状態は次のとおりです。 - >オブジェクト{ 2:オブジェクト、34:オブジェクト、オブジェクトオブジェクト:未定義}

第2のコンソleにはIDが34のオブジェクトがあり、すべてが更新され正しく動作しますが、最後にはundefindオブジェクトObjectが取得されています。ここで

は私の減速である:ここでは

const reducer = function(state={}, action) { 
    switch(action.type) { 
    case "POST_BOOK": 
     return _.mapKeys(action.payload, 'id'); 
    break; 
    case "DELETE_BOOK": 
     return _.omit(state, action.payload); 
    break; 
    case "UPDATE_BOOK": 
     let foundItem = _.get(state, action.payload.id); 
     let updateItem = _.merge(state[action.payload.id],foundItem,action.payload); 
     console.log(updateItem); 
     return _.update(state, state[action.payload.id], updateItem); 
    break; 
    } 
    return state 
} 

は私のアクションは、次のとおりです。

store.dispatch({ 
    type: "POST_BOOK", 
    payload: [ 
    { 
    id: 34, 
    title: 'this is the book title', 
    description: 'this is the book description', 
    price: 3 
    }, 
    { 
    id: 2, 
    title: 'this is the book title 2', 
    description: 'this is the book description 2', 
    price: 3.2 
    } 
] 
}); 

// store.dispatch({ 
// type: "DELETE_BOOK", 
// payload: 2 
// }); 

store.dispatch({ 
    type: "UPDATE_BOOK", 
    payload: { 
    id: 34, 
    title: 'this is book edit title', 
    description: 'this is book edit edit', 
    price: 2341.23 
    } 
}) 
+0

_.update' 'の最後のパラメータがある

そして、これはトリックを行う必要があります関数(https://lodash.com/docs/4.17.4#update)であるはずです。ここではオブジェクトに渡します。これは私が思う問題かもしれません – atomrc

+0

関数を受け取り、選択されたオブジェクトを更新する方法はありますか? –

+0

あなたのコードを見ると、 'return updateItem'を返すだけでいいと思います(名前を変更するかもしれませんが、分かりません)。それはあなたが必要とするすべての情報を持っているようですが、間違っていますか? – atomrc

答えて

1

さて、あなたはここで解決に非常に近いです。あなたのコードに間違っているのは、_.updateがオブジェクトを与えている間に第3のパラメータとして関数を必要とすることだけです。

実際には、2つのオブジェクトを再帰的にマージする_.mergeメソッドでのみ、目的を達成できます。

更新するアイテムのキーを持つオブジェクトを作成し、前の状態にマージするだけで済みます。

それは次のようになりたい:(私は、コードをテストしていない認めざるを得ない)

+0

うまく動作します!そのIDを持つオブジェクトを選択するだけのアップデートですか?私はそれがどう動くか少し混乱しています。 –

+0

いいえ、実際には、 'updates'オブジェクトは状態オブジェクトでオーバーライドしたいすべてのキーを表します。ここで、キー '34'の例では、lodashに' state'をベースとして使用し、 'updates'オブジェクトで定義されているすべてのキーを再帰的にオーバーライドします。 'Object.assign'と全く同じです(ただし、再帰的です)。https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign – atomrc

関連する問題