2017-11-14 6 views
0

関数型プログラミングでは不変性が導入されているため、es6のマップはデータ、特に配列やオブジェクトを扱う際の一般的なアプローチです。 マップを使用してjavascriptオブジェクトを更新する複数の方法

は、私は上記のアプローチ以外にもcheckedプロパティを変更するための代替は何

const todos = (state = [], action) => { 
    switch(action.type) { 
     case 'TOGGLE_TODO': { 
      return state.map(todo => 
       todo.id !== action.id ? todo 
       : { 
       ...todo, checked: !todo.checked 
       } 
      ) 
     } 
     default: 
      return state 
    } 

} 

以下Reduxのの減速がありますか?コードはまったく読むことができますか?

誰かがここで私はどうなるのかだ。この

switch (action.type) { 
     case "TOGGLE_TODO": 
      return [ 
       ...state.slice(0, action.id), 
       {...state[action.id], isCompleted: !state[action.id].isCompleted}, 
       ...state.slice(action.id + 1) 
      ] 
     default: 
      return state; 
    } 
+0

かなりの間違いがあります。ケースに ':'がなく、 'default'が' switch'ブロックの外側にあります – NullDev

+0

あなたのアプローチは実際には[redux's]と同じです(https://github.com/reactjs/redux/blob/master/docs/レシピ/レデューサー/ ImmutableUpdatePatterns.md#アレイ内アイテム更新)1つ。あなたがそれを必要としない限り、それ以上の変更はありません。 – mersocarlin

+0

@mersocarlinなぜitemとaction.itemが必要ですか?それは奇妙だ。 –

答えて

0

を好みます。

const todos = (state = [], action) => { 
    switch(action.type) { 
    case 'TOGGLE_TODO': { 
     let newState = state.concat([]); 
     newState.any((item) => 
     item.id == action.id && 
      (item = { ...item, checked: !item.checked }) 
    ); 

     return newState; 
    } 
    default: 
     return state; 
    } 
} 

あなたのtodoリストのデータ構造をマップに変更することができれば、次のように見えるようになります。

const todos = (state = {}, action) => { 
    switch(action.type) { 
    case 'TOGGLE_TODO': { 
     let itemToChange = state[action.id]; 
     return { 
     ...state, 
     [action.id]: { 
      ...itemToChange, 
      checked: !itemToChange.checked 
     } 
     }; 
    } 
    default: 
     return state 
    } 
} 
+0

これも滑らかです。特に、配列のインデックスを使用する2番目のものは、ループ全体を通過する必要はありません。 –

+0

2番目のアプローチでは、todosのリストは実際には実際のアイテムに(todoアイテムの)idをマッピングする単なるオブジェクト(配列ではありません)です。この回答があなたを助けたら、それを受け入れてupvoting考慮してください:) –

関連する問題