[Fixed] How to update array of objects based on key and values in Angular

Issue

I have below 3 objects listed below with data.

I want to find const oldData.data.parameter_value = b and oldData.data.label_value = b inside
each object of const newData.selected_parameter_value.

And if value exist in newData array, then replace all newData.selected_parameter_value.parameter_value = b and newData.selected_parameter_value.label_value = b , with const updatedData.data.parameter_value = red and const updatedData.data.label_value = red.

For ex –

const oldData = {
  "action": "edit",
  "data": {
    "parameter_value": "b",
    "label_value": "b"
  }
};

const updatedData = {
  "action": "update",
  "data": {
    "parameter_value": "red",
    "label_value": "red"
  }
};

const newData = [
  {
    "context": [],
    "selected_parameter_value": [
      {
        "label_value": "a",
        "parameter_value": "a"
      },
      {
        "label_value": "b",
        "parameter_value": "b"
      }
    ]
  },
  {
    "context": [],
    "selected_parameter_value": [
      {
        "label_value": "b",
        "parameter_value": "b"
      }     
    ]
  }
];

Expected Output

const newData = [
  {
    "context": [],
    "selected_parameter_value": [
      {
        "label_value": "a",
        "parameter_value": "a"
      },
      {
        "label_value": "red",
        "parameter_value": "red"
      }
    ]
  },
  {
    "context": [],
    "selected_parameter_value": [
      {
        "label_value": "red",
        "parameter_value": "red"
      }     
    ]
  }
];

Can Anyone help me to do this.

i tried below code but i dont know how to update matching objects in newData and keep all objects as it is.

editContextData(data) {
    if (data.action === 'edit') {
      this.oldData = data;
    }
    if (data.action === 'update') {
      const oldData = this.oldData;
      const updatedData = this.newData;
      const newData = this.selectedParameterContext.records;
      const newSelectedParameterContext = {
        'records': []
      };     
      newData.forEach(function (record) {
        const newSelectedParameterValues = [];
        record.selected_parameter_value.forEach(function (parameter) {
            if(parameter.parameter_value === oldData.data.parameter_value && parameter.label_value === oldData.data.label_value){
               // here i want to update object and push new values in array.             
                newSelectedParameterValues.push(updatedData);
            }         
        });      
        newSelectedParameterContext.records.push({ 'selected_parameter_value': newSelectedParameterValues });
      
      });
      console.log(newSelectedParameterContext,"rrr");
      this.selectedParameterContext = newSelectedParameterContext;
    }
  }

Solution

        newData.forEach((item) => {
        item.selected_parameter_value.forEach((obj) => {
            if (oldData.data.parameter_value === obj.parameter_value) {
                obj.parameter_value = updatedData.data.parameter_value;
            }

            if (oldData.data.label_value === obj.label_value) {
                obj.label_value = updatedData.data.label_value;
            }
        })

Or if both have to be the same at the same moment then:

        newData.forEach((item) => {

        item.selected_parameter_value.forEach((obj) => {

            if (oldData.data.parameter_value === obj.parameter_value && oldData.data.label_value === obj.label_value) {
                obj.parameter_value = updatedData.data.parameter_value;
                obj.label_value = updatedData.data.label_value;
            }
            
        });
    });

Leave a Reply

(*) Required, Your email will not be published