Redux:Reduced -如何避免嵌套数组递归过程中的对象不可扩展错误?

8fsztsew  于 2023-03-30  发布在  其他
关注(0)|答案(2)|浏览(109)

我有下面的对象数组与嵌套对象:

[
      {
        "name": "ONE",
        "properties": [
          {
             "name": "XXX"
          },
          {
             "name": "YY"
          }
        ]
      },
      {
        "name": "TWO",
        "properties": []
      }
    ]

我尝试在Reducer函数中使用map递归地将属性添加到每个对象。在这里我得到了以下异常:

类型错误:无法添加属性isChecked,对象不可扩展

projectData.myArr.map((item, index) => {
  item.isChecked = false;
  item.properties.map((value, index1) => {
    value.isChecked = false;
  })
});

我尝试使用Object.assign(),正如这里所讨论的:Object is not extensible error when creating new attribute for array of objects

let newData = data.map((item) => 
    Object.assign({}, item, {selected:false})
)

但这种方式允许我只为顶级对象添加属性,而不为内部对象添加属性。
如何解决与Redux模式相关的嵌套对象?

epggiuax

epggiuax1#

使用嵌套展开语法在所需变化的每个级别创建新对象:

projectData.myArr.map((item, itemIndex) => ({
  ...item,
  isChecked: false,
  properties: item.properties.map((value, valueIndex) => ({
    ...value,
    isChecked: false,
  }));
}));
n7taea2i

n7taea2i2#

也可以尝试使用Native StructuredClone或lodash cloneDeep(用于V17.2.0之前的节点版本)

structuredClone(projectData).myArr.map((item, index) => {
  item.isChecked = false;
  item.properties.map((value, index1) => {
    value.isChecked = false;
  })
});

这将创建一个新的克隆,因此redux中的任何属性都不会被修改,允许人们自由地使用代码。

相关问题