2017-02-23 3 views
0

私は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 Aaを変異されなかったけれども、それはありました。オブジェクトの変異を避ける

だから私はいくつかのテストをした:ので、私の仮定の下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しようとする)

+0

新しいリストが古いリストへの参照を持たないように、あなたは深いリストをコピーすることもできます。 – aitchnyu

+1

ディープクローン実装http://lodash.com/docs#cloneDeep – aitchnyu

+0

FWIW:私はaddText' 'という名前の関数を呼び出すときに、私はコピーを期待していません。そして、それは問題の一部です。あなたは_ "(テキスト、値)を各オブジェクト" _に追加しました。それが突然変異です。したがって、あなたが「突然変異しているわけではありませんが」と結論づけたら、理解するのは難しいです。 – zeroflagL

答えて

1

オブジェクトへの変更内容は、(オブジェクトのトップレベルで)本当に浅い場合は、Object.assign({}, oldObj, newObj)場合、またはを使用することができますあなたが有効になってno-mutationルールでこれESLintプラグインhttps://github.com/jhusain/eslint-plugin-immutableを使用することができ、チームでこれを強制するためにバベルで有効Object spread proposal{ ...oldObj, newThing: 'thing' }

を持っています。

+0

ありがとう、私は 'Object.assign()'を使って終了しましたが、突然変異を防ぐためにそれを使っているチームのすべてのプログラマーを強制することは可能ですか? – FacundoGFlores

+1

答えにその提案を追加しました。 –

+0

私はプロジェクトにESLintプラグインを追加しましたが、私はCustomComponent.propTypes' ESLintが「Noオブジェクトの変異は許されない」毛羽立ちれる 'との問題を抱えているが、それは、プロジェクトを反応させるのにこのリンターの適用についてどんな考えをのリアクト事ありますか? – FacundoGFlores

関連する問題