2017-01-05 5 views
0

私はオブジェクトのリストである小道具を持っています。私のレデューサーは、オブジェクトの特定のフィールドを更新してそれをリストに追加することを意図しており、更新する値はaction.payload(の別の小道具である)によって提供されます。リスト内のオブジェクトのフィールドを更新する

私は単純に、リスト内のオブジェクトを追加するために、私はこの

function myReducer(state=[],action){ 
    case something: 
     return [...state,action.payload]; 
    case default: 
     return state; 
} 

のようなスプレッド演算子を使用しますが、私は変更action.payload.aCertainFieldを持ってして、オブジェクトのリストにこれを追加すると言うことができることを知っています。私はこのようなものでした場合:

action.payload.aCertainField = aCertainValue; 
return [...state,action.payload]; 

をしかし、それは実際に他の小道具のaCertainFieldも変更しました。私はそれを望んでいない。これには解決策がありますか?

let { aCertainField, id } = action.payload.obj; 

//find the index of object in that array hoping the id is unique for the object 
let indexOfObject = state.findIndex((item) => item.id === id); 

let actualObject = Object.assign({}, state[indexOfObject], { aCertainField }); 

return [ 
    ...state.slice(0, indexOfObject), 
    actualObject, 
    ...state.slice(indexOfObject+1) 
] 

注:あなたがES6を使用して、以下のようにそれを行うことができます

答えて

1

idはオブジェクト構造のためのユニークな鍵であることを考え、aCertainFieldは

を更新するための値であり、
関連する問題