2016-04-11 3 views
19

私は不変の状態オブジェクトを変更するために純粋な関数を探しています。パラメータとして与えられた元の状態は元のままでなければなりません。これは、Reduxのようなフレームワークを使って作業していて、javacriptのimmutableオブジェクトを扱うのをはるかに簡単にする場合に特に便利です。特に、Babelを使用したオブジェクトスプレッド演算子での作業はすでに可能です。 、拡散演算子と非構造化演算子を使って不変オブジェクトを修正する最短の方法は何ですか

function updateState(state, item) { 
    newState = {...state}; 
    newState[item.id] = item; 
    return newState; 
} 

function deleteProperty(state, id) { 
    var newState = {...state}; 
    delete newState[id]; 
    return newState; 
} 

それがオン状態

答えて

42

アクションに短くすることができますように私は感じる:

は、私が最初のオブジェクトをコピーするよりも、もっと良いものを見つけ、割り当てよりも/私はこのようにするプロパティを削除しませんでした状態は不変であるとみなされる。

プロパティの値を追加または更新:もう少しサポートしてい

// ES6: 
function updateState(state, item) { 
    return Object.assign({}, state, {[item.id]: item}); 
} 

// With Object Spread: 
function updateState(state, item) { 
    return { 
    ...state, 
    [item.id]: item 
    }; 
} 

プロパティを削除

// ES6: 
function deleteProperty(state, id) { 
    var newState = Object.assign({}, state); 
    delete newState[id]; 
    return newState; 
} 

// With Object Spread: 
function deleteProperty(state, id) { 
    let {[id]: deleted, ...newState} = state; 
    return newState; 
} 

// Or even shorter as helper function: 
function deleteProperty({[id]: deleted, ...newState}, id) { 
    return newState; 
} 

// Or inline: 
function deleteProperty(state, id) { 
    return (({[id]: deleted, ...state}) => state)(state); 
} 
+2

尋ねた後、数秒で答えますか? – ColinE

+8

質問を投稿する前に解決策を見つけたので、質問フォームの下にあるフィールドを使用して回答しました。グーグルがそれほど難しいので、私はこれを皆のためにここに入れました。 – Tarion

+0

しかし、実際には、プロパティを削除することも面白い質問です。プロパティを未定義に設定するとキーが削除されず、オブジェクト定義内で削除が機能しないように見えます; – Tarion

7

アンES6溶液は、Object.assignある:

const updateState = (state, item) => Object.assign({}, state, { [item.id]: item }); 
+0

もちろん、ES5スタイルでも同じです。 – Tarion

+0

実際にはES6スタイルです。使用したObject spreadはES7です。 –

+0

申し訳ありません、質問を更新してください。これにはbabel es6 + pluginを使用します;)ちょっと混乱しました。 – Tarion

0

配列から項目を削除するには、単にfilter;を使用してください)

CASE 'REMOVE_ITEM_SUCCESS': 

     let items = state.items.filter(element => element._id !== action.id); 

     return { 
      ...state, 
      items 
     } 
関連する問題