Javascript 如何在React(已编辑)中设置嵌套数组的状态
我有这组数据Javascript 如何在React(已编辑)中设置嵌套数组的状态,javascript,arrays,reactjs,Javascript,Arrays,Reactjs,我有这组数据 this.state={ 周数:[ { 周数:1, 重量:[] }, { 周数:2, 重量:[] } ] } 我想做的是创建一个新数组并将其设置为“权重”。我看过其他类似的帖子: 我想我也做过类似的事情 编辑:另外,比如说,我想更新每个星期的权重数组,我该怎么做呢?我通常使用以下解决方案: const newWeeks = [ ...this.state.weeks ]; newWeeks[0] = { ...newWeeks[0] }; //modify `newWeeks`
this.state={
周数:[
{
周数:1,
重量:[]
},
{
周数:2,
重量:[]
}
]
}
我想做的是创建一个新数组并将其设置为“权重”。我看过其他类似的帖子:
我想我也做过类似的事情
编辑:另外,比如说,我想更新每个星期的权重数组,我该怎么做呢?我通常使用以下解决方案:
const newWeeks = [ ...this.state.weeks ];
newWeeks[0] = { ...newWeeks[0] };
//modify `newWeeks`
this.setState({
weeks: newWeeks
});
更新1: 实时版本:
更新2:谢谢@bird。问题是复制数组(或对象)时,扩展只会深入一层,所以我们需要在这里多做一步:
newWeeks[0] = { ...newWeeks[0] };
因为它是一个嵌套对象,所以您可以使用
JSON.parse(JSON.stringify(obj))
另一个普通克隆,如:[…this.state.weeks]
或Object.assign([],this.state.weeks)
仅克隆级别1的属性,而不是嵌套的属性,在您的情况下,weight
属性将不会被克隆,只是以正常方式复制引用
您可以查看
lodash的lib,也可以使用它来归档您的目标。您是否正在尝试在状态中创建一个名为“权重”的新条目或创建一个名为“权重”的变量?@CodySwann我想我会创建一个新的数组变量,并使用该新数组变量来更新状态“权重”@Bpicks-看看react的不变性帮助程序,特别是更新方法。您可以创建一个新的状态对象,然后使用setState用更新的状态更新整个状态@heyitsjhu打败了我。那是最好的办法。否则,您必须对扩展进行一些讨厌的对象扩展operator@CodySwann`@heyitsjhu好的,比如说我想更新两周的“权重”数组。我是否只是每周映射并使用来自不变性助手的更新方法更新状态?这不是克隆嵌套对象的方法。权重属性仍然是一个引用。修改了newWeeks[0]。weight
导致更改为this.state.weeks[0]。weight
也。您好,您可以看到我使用扩展语法从旧数组创建了新数组,它使用值创建了新数组,而不是引用,请在此处阅读有关它的详细信息>只需放置console.log(this.state.weeks)代码>在代码沙箱的第21行,就在newWeeks[0]之后。权重=[1,2,3]代码>行。当setState
操作尚未运行时,您将看到周[0]。权重也被修改。
this.state = {
weeks: [
{
weekNumber: 1,
weights: []
},
{
weekNumber: 2,
weights: []
}
]
}
const newWeeks = JSON.parse(JSON.stringify(this.state.weeks))
newWeeks[0].weights = [1,2,3]
this.setState({weeks: newWeeks})