您所描述的情况是可变数据结构具有明显优势的情况,但如果您从使用不可变数据中受益,那么还有更好的方法。
虽然保持它不可变意味着您的新更新对象是全新的,但这是双向的:您可能有一个新对象,但您仍然可以访问原始对象!你可以用它做很多巧妙的事情,例如链接你的对象,这样你就有一个撤销历史,并且可以及时回滚以回滚更改。
所以不要在数组中使用一些 hacky 的查找属性。您的示例的问题是因为您在错误的时间构建了一个新对象:没有函数返回该对象的副本。让函数返回原始对象,并使用原始对象作为索引调用您的更新。
let myThings = [new MyType(), new MyType(), new MyType()];
// We update by taking the thing, and replacing with a new one.
// I'll keep the array immutable too
function replaceThing(oldThing, newThing) {
const oldIndex = myThings.indexOf(oldThing);
myThings = myThings.slice();
myThings[oldIndex] = newThing;
return myThings;
}
// then when I want to update it
// Keep immutable by spreading
const redThing = myThings.find(({ red }) => red);
if (redThing) {
// In this example, there is a 'clone' method
replaceThing(redThing, Object.assign(redThing.clone(), {
newProperty: 'a new value in my immutable!',
});
}
话虽如此,类也使这变得更加复杂。保持简单对象不可变要容易得多,因为您可以简单地将旧对象传播到新对象中,例如{ ...redThing, newProperty: 'a new value' }
. 一旦你得到一个高于 1 的对象,你可能会发现 immutable.js 更有用,因为你可以mergeDeep
.