Ste*_*eve 2 javascript arrays element immutability
假设我有一个以下形式的数组:
const array = [{id: 1, title: "this"}, {id: 2, title: "that"}];
Run Code Online (Sandbox Code Playgroud)
我想更改给定对象中一个元素的值。例如,我的输出如下:
[{id: 1, title: "这个"}, {id: 2, title: "foo foo foo"}];
我将一个具有两个属性的对象传递给我的函数。第一个属性是我要修改的对象的id ,第二个属性是新标题:
[2, "foo foo foo"]
Run Code Online (Sandbox Code Playgroud)
我可以使用以下代码找到正确对象的索引:
index = array.findIndex(item => item.id === arr[0]);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何更改该元素并将其替换为我的新标题(arr[1])。
我想更改第二个对象中的标题元素而不改变数组。任何意见是极大的赞赏。
编辑:对于“不改变数组”的困惑,我们深表歉意。我的意思是我不希望返回的数组只是原始数组的突变,而是一个新数组。也许“不改变状态”会是更好的措辞选择。
例如,如果我要像这样返回一个数组: return [...state] 这将为我提供一个新数组(尽管没有任何更改),而不会改变原始数组。
如果没有 \xe2\x80\xa6 很好地改变一个对象,你就无法真正改变它。您需要该对象的副本。假设复制数组不会花费太多,您可以执行以下操作:
\n\nconst arr = [{id: 1, title: "this"}, {id: 2, title: "that"}];\r\nconst a2 = arr.map(i => i.id == 2 ? Object.assign({}, i, {title: \'foo foo foo\'}): i)\r\n\r\nconsole.log("original: ", arr)\r\nconsole.log("with changes: ", a2)
Run Code Online (Sandbox Code Playgroud)\r\n在这种情况下,您将复制原始对象(已更改的对象除外),该对象会获取包含更改的副本并保留原始对象。
\n