1

I have these two arrays:

original

[
   { id: "1"},
   { id: "2"},
   { id: "3"}
]

old

[
   { id: "1"},
   { id: "7"},
   { id: "9"}
]

I'm trying to remove all the items which are available in old from original, so I did:

original = original.filter(function(el) {
                    return old.indexOf(el) < 0;
                }.bind(this));

but I get the same items, what I did wrong? Here is the code snippet.

let original = [{
    id: "1"
  },
  {
    id: "2"
  },
  {
    id: "3"
  }
];

let old = [{
    id: "1"
  },
  {
    id: "7"
  },
  {
    id: "9"
  }
];
console.log(original);

original = original.filter(function(el) {
  return old.indexOf(el) < 0;
}.bind(this));

console.log(original);
Nik
  • 1,060
  • 1
  • 10
  • 19
sfarzoso
  • 749
  • 1
  • 6
  • 29

4 Answers4

1
  var original = [
   { id: "1"},
   { id: "2"},
   { id: "3"}
  ],
  old = [
     { id: "1"},
     { id: "7"},
     { id: "9"}
  ];

  var result = original.filter(function(obj) { return old.every(function(obj2) { return obj.id != obj2.id;}) });

console.log(result)

This will return: 2,3

Janus Pienaar
  • 1,014
  • 7
  • 13
1

indexOf cannot compare the contents of objects.

You need to check the id

var original = [
   { id: "1"},
   { id: "2"},
   { id: "3"}
  ],
  old = [
     { id: "1"},
     { id: "7"},
     { id: "9"}
  ];


original = original.filter(function(el) {
  return old.findIndex(item => item.id === el.id) < 0;
});

console.log(original);
Gabriele Petrioli
  • 173,972
  • 30
  • 239
  • 291
1

You could take a Set with the unwanted id and filter the array.

var array = [ { id: "1" }, { id: "2" }, { id: "3" }],
    old = [{ id: "1" }, { id: "7" }, { id: "9" }],
    oldSet = new Set(old.map(({ id }) => id));
    
array = array.filter(({ id }) => !oldSet.has(id));

console.log(array);
Nina Scholz
  • 323,592
  • 20
  • 270
  • 324
1

Using filter and forEach

var old=[
   { id: "1"},
   { id: "2"},
   { id: "3"}
]


var original=[
   { id: "1"},
   { id: "7"},
   { id: "9"}
]
var obj=[];
old.forEach((e)=>obj.push(e.id))
console.log(original.filter((e)=>!obj.includes(e.id)?true:false))
ellipsis
  • 11,498
  • 2
  • 13
  • 33