私はReactとES6で作業しています。だから私は次の場合に到着しました:オブジェクトの配列を持つ状態を持ってObject A
の状態でa = [{id: 1, value: 1}, {id: 2, value: 2}]
と仮定し、Object B
の小道具、Object B
(コンストラクタ内)リストを自分の状態にコピーして呼び出します私はb = [{id: 1, value: 1, text: 'foo'}, {id: 2, value: 2, text: 'foo'}]
map
を返す関数を使用している機能は、(各オブジェクトに(text, value)
を加えた)ので、それはObject A
でa
を変異されなかったけれども、それはありました。オブジェクトの変異を避ける
だから私はいくつかのテストをした:ので、私の仮定の下a !== b
const a = [{id: 1, value: 1}, {id: 2, value: 2}] // suppose it is in object A
addText = (list) => {
return list.map((item) => {item.text = "foo"; return item})
}
const b = addText(a) // suppose it is in object B
、彼らが同じだったのでa
は、addText
により変異しました。大規模なプロジェクトのプログラマーで
は(私はここでやった!)ミスを犯すことは、この方法でオブジェクトを変異避けるために、状況のこの種を取り扱うことになっていますか? (例が反応からコンポーネントですObject A
ためstate
としてa
をrepresetしようとする)
新しいリストが古いリストへの参照を持たないように、あなたは深いリストをコピーすることもできます。 – aitchnyu
ディープクローン実装http://lodash.com/docs#cloneDeep – aitchnyu
FWIW:私はaddText' 'という名前の関数を呼び出すときに、私はコピーを期待していません。そして、それは問題の一部です。あなたは_ "(テキスト、値)を各オブジェクト" _に追加しました。それが突然変異です。したがって、あなたが「突然変異しているわけではありませんが」と結論づけたら、理解するのは難しいです。 – zeroflagL