避免对象突变

IT技术 javascript reactjs ecmascript-6
2021-05-05 17:41:57

我正在使用 React 和 ES6。所以我遇到了以下情况:我有一个状态,其中包含一个对象数组,假设a = [{id: 1, value: 1}, {id: 2, value: 2}]处于 状态Object A,然后我将列表传递给Object Bprops,Object B(在构造函数中)将列表复制到它自己的状态并调用一个函数map在我返回的地方使用函数b = [{id: 1, value: 1, text: 'foo'}, {id: 2, value: 2, text: 'foo'}](添加(text, value)到每个对象中),所以它虽然没有发生变异aObject 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,所以他们是平等的。

在大型项目中程序员会犯错误(我在这里犯过!)应该如何处理这种情况以避免以这种方式改变对象?(示例试图represeta作为state用于Object A其是从react的组分)

1个回答

如果您对对象的更改真的那么浅(在对象的顶层),您可以使用Object.assign({}, oldObj, newObj),或者如果您在 babel 中启用对象传播提议{ ...oldObj, newThing: 'thing' }

要在团队中强制执行此操作,您可以使用此 ESLint 插件https://github.com/jhusain/eslint-plugin-immutableno-mutation启用规则。