How to compare array of object based on key and value and delete object

Viewed 66

I have below data in const rows.

const rows = {
      "selected_parameter_value": [
        {
          "parameter_value": "a",
          "label_value": "a"
        },
        {
          "parameter_value": "d",
          "label_value": "d"
        }
      ]
    };

I want to compare each and every object of const rows.selected_parameter_value with parameter_value and label_value from this.selectedParameterContext.records[0].selected_parameter_value.

And delete those objects from this.selectedParameterContext.records[0].selected_parameter_value which are not present in const rows.selected_parameter_value

For example -

In the const rows.selected_parameter_value, only a and d object are present, b and c are not present.

So remove object whose parameter and label values are b and c from this.selectedParameterContext.records[0].selected_parameter_value.

this.selectedParameterContext = {
          'records': [
            {
              'selected_parameter_value': [{
                'parameter_value': 'a',
                'label_value': 'a'
              },
              {
                'parameter_value': 'b',
                'label_value': 'b',
              }]
            },
            {
              'selected_parameter_value': [{
                'parameter_value': 'c',
                'label_value': 'c'
              },
              {
                'parameter_value': 'd',
                'label_value': 'd',
              }]
            }]
        };

Expected Output

this.selectedParameterContext = {
  'records': [
    {
      'selected_parameter_value': [{
        'parameter_value': 'a',
        'label_value': 'a'
      }]
    },
    {
      'selected_parameter_value': [
        {
          'parameter_value': 'd',
          'label_value': 'd',
        }]
    }]
};

Below code

deleteContextData(rows ) { 
    const paramArray = rows.selected_parameter_value;
    const newArrayData = this.selectedParameterContext.records[0].selected_parameter_value;
    const removeMatchingData = (paramArray, toCompareWith) => {
      return paramArray.filter(({ label_value }) => !toCompareWith.some(compareObj => compareObj.label_value === label_value));
    }
    console.log(removeMatchingData(paramArray, newArrayData),"newarray");
}
2 Answers
  • You need to loop though this.selectedParameterContext.records
  • then inside first loop, second loop though record.selected_parameter_value
  • then use rows.selected_parameter_value.find(...) to validate
  • then use .splice(...) to remove item from this.selectedParameterContext.records
  • or add required data to array

const rows = {
  "selected_parameter_value": [
    {
      "parameter_value": "a",
      "label_value": "a"
    },
    {
      "parameter_value": "d",
      "label_value": "d"
    }
  ]
};

const selectedParameterContext = {
  'records': [
  {
    'selected_parameter_value': [
      {
        'parameter_value': 'a',
        'label_value': 'a'
      },
      {
        'parameter_value': 'b',
        'label_value': 'b',
      }
    ]
  },
  {
    'selected_parameter_value': [
      {
        'parameter_value': 'c',
        'label_value': 'c'
      },
      {
        'parameter_value': 'd',
        'label_value': 'd',
      }
    ]
  }
  ]
};

selectedParameterContext.records.forEach(function(record, recordIndex) {
  record.selected_parameter_value.forEach(function(parameter, parameterIndex) {
    const isValid = rows.selected_parameter_value.find(function(item) {
      return parameter.parameter_value === item.parameter_value && parameter.label_value === item.label_value;
    });
    if (!isValid) {
      selectedParameterContext.records[recordIndex].selected_parameter_value.splice(parameterIndex, 1);
    }
  });
});

console.log('selectedParameterContext: ', selectedParameterContext);

For new array variable

const rows = {
      "selected_parameter_value": [
        {
          "parameter_value": "a",
          "label_value": "a"
        },
        {
          "parameter_value": "d",
          "label_value": "d"
        }
      ]
    };

    const selectedParameterContext = {
      'records': [
      {
        'selected_parameter_value': [
          {
            'parameter_value': 'a',
            'label_value': 'a'
          },
          {
            'parameter_value': 'b',
            'label_value': 'b',
          }
        ]
      },
      {
        'selected_parameter_value': [
          {
            'parameter_value': 'c',
            'label_value': 'c'
          },
          {
            'parameter_value': 'd',
            'label_value': 'd',
          }
        ]
      }
      ]
    };
    
    // Building new array variable
    const newSelectedParameterContext = {
      'records': []
    };

    selectedParameterContext.records.forEach(function(record, recordIndex) {
      const newSelectedParameterValues = [];
      record.selected_parameter_value.forEach(function(parameter, parameterIndex) {
        const isValid = rows.selected_parameter_value.find(function(item) {
          return parameter.parameter_value === item.parameter_value && parameter.label_value === item.label_value;
        });
        if (isValid) {
          newSelectedParameterValues.push(parameter);
        }
      });
      newSelectedParameterContext.records.push({'selected_parameter_value': newSelectedParameterValues});
    });

    console.log('newSelectedParameterContext: ', newSelectedParameterContext);

your data initialized as const. It is mean that variable is not mutable. So I suggest you to rebuild like this.

const selectedParameterContext = {
  'records': [
    {
      'selected_parameter_value': [{
        'parameter_value': 'a',
        'label_value': 'a'
      },
      {
        'parameter_value': 'b',
        'label_value': 'b',
      }]
    },
    {
      'selected_parameter_value': [{
        'parameter_value': 'c',
        'label_value': 'c'
      },
      {
        'parameter_value': 'd',
        'label_value': 'd',
      }]
    }]
};

var selectedParameterContext2 = {
  'records': []
}

selectedParameterContext.records.forEach(e=>{
  var records = [];
  e.selected_parameter_value.forEach(f=>{
    if(f.parameter_value==='a'||f.parameter_value==='d')
      records.push(f)
    
  })
  selectedParameterContext2.records.push({'selected_parameter_value': records})
})

console.log(selectedParameterContext2)

Related