Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在React(已编辑)中设置嵌套数组的状态_Javascript_Arrays_Reactjs - Fatal编程技术网

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})