あなたが述べたように、あなたは、スプレッドの代わりにObject.assign
を使用することができます。
{...state, x: 1}
は
Object.assign({}, state, {x: 1})
とあなたに同じ結果を与える必要がありObject.assign
の最初のパラメータとして空のオブジェクトに注意してください。これは、state
の値を新しい空のオブジェクトにコピーし、{first: 1}
の値を新しいオブジェクトにコピーすることです。例えば
:
var a = { x: 1, y: 2}
var b = {...a, y: 3 }
console.log(a); // { x: 1, y: 2 }
console.log(b); // { x: 1, y: 3 }
はa
とc
両方が不変であることである
var c = { x: 1, y: 2 }
var d = Object.assign({}, a, { y: 3 });
console.log(c); // { x: 1, y: 2 }
console.log(d); // { x: 1, y: 3 }
重要な部分に相当します。 b
とd
の新しい値はy
です。ネストされたオブジェクトの場合
、あなたは、このプロセスを繰り返します
function updateVeryNestedField(state, action) {
return Object.assign({}, state, {
first : Object.assign({}, state.first, {
second : Object.assign({}, state.first.second, {
[action.someId] : Object.assign({},
state.first.second[action.someId],
{ fourth : action.someValue }
)
})
})
});
}
var oldState = { first: { second: { 'anId': { fourth: 3 } } } };
var newState = updateVeryNestedField(oldState, { someId: 'anId', someValue: 5 });
console.log(oldState.first.second.anId.fourth); // 3
console.log(newState.first.second.anId.fourth); // 5
しかし、フルES2015をサポートするために、あなたはまた、use computed keysすることができません。だから代わりにreturn文の前にオブジェクトのいくつかを構築しておきます。例:
function updateVeryNestedField(state, action) {
// Create a temporary object to avoid use of computed keys
var updatedSecond = Object.assign({}, state.first.second);
updatedSecond[action.someId] = Object.assign({}, state.first.second[action.someId], {
fourth: action.someValue
});
return Object.assign({}, state, {
first : Object.assign({}, state.first, { second : updatedSecond })
});
}
var oldState = { first: { second: { 'anId': { fourth: 3 } } } };
var newState = updateVeryNestedField(oldState, { someId: 'anId', someValue: 5 });
console.log(oldState.first.second.anId.fourth); // 3
console.log(newState.first.second.anId.fourth); // 5
ありがとうございます。 – skwny
これはes5で許されますか? '[action.someId]:...'? uglifier.jsで縮小するとエラーが発生しますが、他の人もこの問題を経験しています。しかし、バンドルしているが、小型化していないときは通り過ぎる。 – skwny
@skwy残念ながら計算されたキーはES2015の一部です。一時オブジェクトを導入して計算されたキーを使用しないようにする方法を示すために私の例を更新しました。この新しい例では、インデックスを使用して一時オブジェクトにプロパティを追加しています。 – grovesNL