我正在使用React和ES6。所以我到了以下情况:我有一个对象数组的状态假设a = [{id: 1, value: 1}, {id: 2, value: 2}]
处于Object A
状态,然后我通过列表Object B
通过道具,Object B
(在构造函数中)将列表复制到它自己的状态并调用一个函数使用map
函数,其中我返回b = [{id: 1, value: 1, text: 'foo'}, {id: 2, value: 2, text: 'foo'}]
(为每个对象添加(text, value)
),所以它虽然没有在Object A
中变异a
,但它是。避免物体突变
所以我做了一些测试:
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 !== b
,但a
被addText
突变,所以他们都是平等的。
在一个大规模项目中,程序员犯了错误(我在这里做过!)应该如何处理这种情况以避免以这种方式变异对象? (这个例子试图represet a
为state
为Object A
这是从反应的成分)
您可以深度复制列表,以便新列表不会引用旧列表。 – aitchnyu
深入克隆实现http://lodash.com/docs#cloneDeep – aitchnyu
FWIW:当我调用一个名为'addText'的函数时,我不希望有副本。这是问题的一部分。你甚至写了“为每个对象添加了(文本,值)”_。这是突变。因此,当你总结“尽管它没有变化”时,很难理解。 – zeroflagL