简体   繁体   English

使用 setState() 更新嵌套数组

[英]Update nested array using setState()

I want to setState() to edit parameter value which is in parameterData Array .我想 setState() 来编辑parameterData Array中的参数值。 using setState method.使用 setState 方法。 If we can do this without any third part library like Immutabilty helper or lodash that would be great!如果我们可以在没有任何第三方库(例如 Immutabilty helperlodash)的情况下做到这一点,那就太好了!

The Given state is给定的 state 是

   const[state,setState]= useState ([{
    "id": 0,
    "targets": {
        "ageGender": {
        "key":value
        },
        "parameterData": [
            {
                "id": 1,
                "parameter": "Low",
                "expression": "<",
                "val": "10",
                "indicator": "Select"
            },
            
        ]
    }
}])

I have tried this solution where我已经尝试过这个解决方案

idx = state index where object is situated idx = state 索引 object 所在的位置
index = index of parameterData array to be changed index = 要更改的 parameterData 数组的索引
event = event of change事件 = 变化事件

  const handleChangeTextParameter = (event, index, idx) => {
    const { name, value } = event.target;

    setState((prev) => {
      const newState = prev.map((obj, index1) => {
        let fil;
        if (index1 === idx) {
          fil = obj.targets.parameterData.map((data, indexOne) => {
            if (indexOne === index) {
              return { ...data, parameter: value };
            }
            return data;
          });
          const p = obj.targets.parameterData.map(
            (obj) => fil.find((o) => o.id === obj.id) || obj
          );

          return { ...obj, targets: { ...obj.targets, parameterData: p } };
        }
      });

      return newState;
    });

    
  };

Disclaimer: The state variables you defined are called state and setState , but in your handleChangeTextParameter you are using setTargets so I assume they are the same免责声明:您定义的 state 变量称为statesetState ,但在您的handleChangeTextParameter中您使用的是setTargets所以我认为它们是相同的
I think the following should work:我认为以下应该有效:

setTargets((prev) => {
    const newTargets = prev.map((object, objectIndex) => {
        if (objectIndex !== idx) return object;
        return {
            ...object,
            targets: {
                ...object.targets,
                parameterData: object.target.parameterData.map((data, dataIndex) => {
                    if (dataIndex !== index) return data;
                    return { ...data, parameter: value };
                }),
            },
        };
    });
    return newTargets;
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM