Home > Software engineering >  JS intersection of array and object of arrays
JS intersection of array and object of arrays

Time:06-21

I want to delete some item from my object :

clientData : {
1111 : [
  {ID : 112, name : 'John',age : 23},
  {ID : 113, name : 'Doe',age : 21},
  {ID : 114, name : 'Stan',age : 24},
],

2222 : [
  {ID : 222, name : 'Sara',age : 15},
  {ID : 223, name : 'Wiliams',age : 61},
  {ID : 224, name : 'Alan',age : 45},
],

}

The data that I want to delete is stored in an array of Id's like this :

[112,223,114]

So the output should look like this :

clientData : {
1111 : [
  {ID : 113, name : 'Doe',age : 21},
],
2222 : [
  {ID : 222, name : 'Sara',age : 15},
  {ID : 224, name : 'Alan',age : 45},
],
}

Any help please how to achieve this ? I really have no idea how to do it, and don't found any solutions in internet.

CodePudding user response:

Loop through each object property and filter the array based on the delete ID's.

let deleteIds = [112,223,114];

for (const data in clientData) {
  clientData[data] = clientData[data].filter(list=>!deleteIds.includes(list.ID));
}

console.log(clientData) // prints out your object

CodePudding user response:

I am assuming you are tying to filter out the original object. Hence, You can simply achieve it by using Array.forEach() method along with the Array.splice().

Live Demo :

const clientData = {
  1111 : [
    {ID : 112, name : 'John',age : 23},
    {ID : 113, name : 'Doe',age : 21},
    {ID : 114, name : 'Stan',age : 24},
  ],
  2222 : [
    {ID : 222, name : 'Sara',age : 15},
    {ID : 223, name : 'Wiliams',age : 61},
    {ID : 224, name : 'Alan',age : 45},
  ]
};

const invalidValues = [112, 223, 114];

Object.keys(clientData).forEach(key => {
    clientData[key].forEach((obj, index) => {
    if (invalidValues.includes(obj.ID)) {
        clientData[key].splice(index, 1);
    }
  })
});

console.log(clientData);

CodePudding user response:

You could use Array.reduce() along with Array.filter()to delete the items from the client array.

I would suggest creating a Set to contain the ids to be deleted. This will make lookup more efficient than using an array (using Set.has)

const clientData = { 1111 : [ {ID : 112, name : 'John',age : 23}, {ID : 113, name : 'Doe',age : 21}, {ID : 114, name : 'Stan',age : 24}, ],  2222 : [ {ID : 222, name : 'Sara',age : 15}, {ID : 223, name : 'Wiliams',age : 61}, {ID : 224, name : 'Alan',age : 45}, ],  } 

const idsToDelete = new Set([112,223,114]);

const result = Object.keys(clientData).reduce((acc, key) => { 
    acc[key] = clientData[key].filter(({ID}) => !idsToDelete.has(ID));
    return acc;
}, {});

console.log('Result:', result)
.as-console-wrapper { max-height: 100% !important; }

CodePudding user response:

You can loop your clientData object with for....in loop.

    let clientData = {
1111 : [
  {ID : 112, name : 'John',age : 23},
  {ID : 113, name : 'Doe',age : 21},
  {ID : 114, name : 'Stan',age : 24},
],

2222 : [
  {ID : 222, name : 'Sara',age : 15},
  {ID : 223, name : 'Wiliams',age : 61},
  {ID : 224, name : 'Alan',age : 45},
],

};

const dataToDelete = [112, 223, 114];

for (const key in clientData) {
  clientData[key].forEach((data,index) =>{ 
       if (dataToDelete.includes(data.ID)){
        clientData[key].splice(index,1)
}
})
}
console.log(clientData);

  • Related