0

I'm a beginner and I'm learning, please don't close my question.

I need to filter elements with the property toRemove:true

{
  1: {itemId: 10, offset: 5, verticalPosition: 1, horizontalPosition: 35, toRemove: true},
  2: {itemId: 10, offset: 10, verticalPosition: 3, horizontalPosition: 65, toRemove: true},
  3: {itemId: 6, offset: 30, verticalPosition: 2, horizontalPosition: 109},
  4: {itemId: 8, offset: 40, verticalPosition: 5, horizontalPosition: 40},
  5: {itemId: 7, offset: 50, verticalPosition: 9, horizontalPosition: 50, toRemove: true},
  6: {itemId: 7, offset: 35, verticalPosition: 8, horizontalPosition: 77},
  7: {itemId: 7, offset: 45, verticalPosition: 7, horizontalPosition: 66}
}

What I expect is the key/obj as the code below.

{
  3: {itemId: 6, offset: 30, verticalPosition: 2, horizontalPosition: 109},
  4: {itemId: 8, offset: 40, verticalPosition: 5, horizontalPosition: 40},
  6: {itemId: 7, offset: 35, verticalPosition: 8, horizontalPosition: 77},
  7: {itemId: 7, offset: 45, verticalPosition: 7, horizontalPosition: 66}
}

How could I filter it?

felipe muner
  • 357
  • 2
  • 6
  • 13

2 Answers2

2

You can use Object.keys() to iterate through the object and delete the elements you don't want. Instead of delete, you can also add them to a new variable as well.

var data = {
  1: {itemId: 10, offset: 5, verticalPosition: 1, horizontalPosition: 35, toRemove: true},
  2: {itemId: 10, offset: 10, verticalPosition: 3, horizontalPosition: 65, toRemove: true},
  3: {itemId: 6, offset: 30, verticalPosition: 2, horizontalPosition: 109},
  4: {itemId: 8, offset: 40, verticalPosition: 5, horizontalPosition: 40},
  5: {itemId: 7, offset: 50, verticalPosition: 9, horizontalPosition: 50, toRemove: true},
  6: {itemId: 7, offset: 35, verticalPosition: 8, horizontalPosition: 77},
  7: {itemId: 7, offset: 45, verticalPosition: 7, horizontalPosition: 66}
}

Object.keys(data).forEach((key)=> {
  if (data[key].toRemove) delete data[key]
})

console.log(data)
Rifat Bin Reza
  • 2,601
  • 2
  • 14
  • 29
1

If you want to use .filter(), you can use it on Object.values(). Then assign it to a new Object,

let obj = {
  1: {itemId: 10, offset: 5, verticalPosition: 1, horizontalPosition: 35, toRemove: true},
  2: {itemId: 10, offset: 10, verticalPosition: 3, horizontalPosition: 65, toRemove: true},
  3: {itemId: 6, offset: 30, verticalPosition: 2, horizontalPosition: 109},
  4: {itemId: 8, offset: 40, verticalPosition: 5, horizontalPosition: 40},
  5: {itemId: 7, offset: 50, verticalPosition: 9, horizontalPosition: 50, toRemove: true},
  6: {itemId: 7, offset: 35, verticalPosition: 8, horizontalPosition: 77},
  7: {itemId: 7, offset: 45, verticalPosition: 7, horizontalPosition: 66}
};

let res = Object.assign({}, Object.values(obj).filter(e => !e.toRemove));
console.log(res);
NullDev
  • 6,739
  • 4
  • 30
  • 54
  • Hello friend, thank you so much. But help me a bit more... 2 points: - I don't need to use .filter() - I need to keep the real ID, your example is setting 0 and auto-incrementing after – felipe muner Mar 15 '21 at 08:43
  • 2
    @felipemuner In that case, [@Rifat Bin Reza](https://stackoverflow.com/users/6480803/rifat-bin-reza)'s [answer](https://stackoverflow.com/a/66634763/7575111) is better. – NullDev Mar 15 '21 at 08:46