Javascript 正确更新状态数组中给定索引处的项

Javascript 正确更新状态数组中给定索引处的项,javascript,arrays,reactjs,Javascript,Arrays,Reactjs,与此不同,我不想在数组中添加新项,但我想在索引I处修改该项 除了像那样深度克隆整个阵列,还有其他解决方案吗 const oldList = this.state.list; let newList = JSON.parse(JSON.stringify(oldList)); newList[i] = "foo"; this.setState({list: newList}); 谢谢您的帮助。您可以使用spread const oldList = this.state.list; let new

与此不同,我不想在数组中添加新项,但我想在索引
I
处修改该项

除了像那样深度克隆整个阵列,还有其他解决方案吗

const oldList = this.state.list;
let newList = JSON.parse(JSON.stringify(oldList));
newList[i] = "foo";
this.setState({list: newList});
谢谢您的帮助。

您可以使用spread

const oldList = this.state.list;
let newList = [...oldList];
newList[i] = "foo";
this.setState({ .list: newList });
但如果数组的元素是对象,则排列将不起作用。因为它只会创建引用旧对象的数组的新副本。但在您的情况下,您分配字符串。所以它是原始类型



如果我是对的,spread操作符基本上会进行深度克隆

Spread不做浅层克隆。将
数组排列
与创建新数组相同,并将所有旧值复制到新数组中

a = [...b];

a = [];
for(let i = 0; i < b.length; i++) a.push(b[i]);
对于pop,您可以使用
splice

a = b.slice(-1, 1);

取决于项是object还是Primit。您的意思是,仅当项是基元类型时,“排列”操作符才起作用?不,但浅复制对象数组将在每个索引处创建相同对象引用的多个数组。这也取决于你的期望是什么,但浅拷贝一系列原语也是深度克隆,我想知道是否没有其他选择。此外,我不知道如果直接修改状态数组中引用的对象,是否会在React中产生问题,例如:
this.state.list[3].text=“foo”。就其本身而言,
this.state.list[3]
引用的对象未处于该状态。可供选择的方法有
Array#slice()
或spread,它们的开销比JSON方法小。如果我是正确的,spread操作符基本上会执行深度克隆。如果项目是object类型,我们必须使用
JSON.parse(JSON.stringify(oldList))
,我错了吗?这是React与Vue.js相比的一个缺点,因为Vue会覆盖数组上的变异方法,如
push(…)
pop(…)
,以便您可以毫无问题地使用它们。感谢您的编辑。因此,仅使用一个
this.setState(…)
,无法在一行中修改索引
i
处的项?我们必须在复制数组和更新项之前执行此操作吗?
a = b.slice(-1, 1);