0

I'm trying to compare 2 array of objects together and remove the duplicates. For example...

var array1 = [0, 1, 2, 3, 4, 5, 6];
var array2 = [7, 8, 1, 2, 9, 10];

How can I check the array2 for any element of array1 and if true then remove that from array2 to eliminate the duplication.

The expected result: array 2 = [7, 8, 9, 10]

Any help would be appreciated, thanks

asmmahmud
  • 4,844
  • 2
  • 40
  • 47
Jake K
  • 75
  • 1
  • 7

3 Answers3

2

If the array include primitive types you can use indexOf and array#reduce

const array1 = [0, 1, 2, 3, 4, 5, 6]
const array2 = [7, 8, 1, 2, 9, 10]

var result = array2.filter((num) => {
  return array1.indexOf(num) === -1;
});

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

In case of an object, you can get the unique values in second array in comparison to first, please use array#reduce and array#some.

const person1 = [{"name":"a", "id":0},{"name":"A", "id":1},{"name":"B", "id":2},{"name":"C", "id":3},{"name":"D", "id":4},{"name":"E", "id":5},{"name":"F", "id":6}]
const person2 = [{"name":"G", "id":7},{"name":"H", "id":8},{"name":"A", "id":1},{"name":"B", "id":2},{"name":"I", "id":9}, {"name":"J", "id":10}]

var unique = person2.reduce((unique, o) => {
  let isFound = person1.some((b) => {
    return b.id === o.id;
  });
  if(!isFound)
    unique.push(o);
  return unique;
},[]);

console.log(unique);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Hassan Imam
  • 21,956
  • 5
  • 41
  • 51
  • This returns the same array. I want to compare against the IDs inside the objects in the array and remove the duplicates that have the same ID – Jake K Aug 08 '17 at 13:03
1

just filter second array.

const array1 = [0, 1, 2, 3, 4, 5, 6];
const array2 = [7, 8, 1, 2, 9, 10];

const newArray = array2.filter(i => !array1.includes(i));

console.log(newArray);
Fazal Rasel
  • 4,446
  • 2
  • 20
  • 31
  • This returns the same array. I want to compare against the IDs inside the objects in the array and remove the duplicates that have the same ID – Jake K Aug 08 '17 at 13:03
1

You can use do this:

var array1 = [0, 1, 2, 3, 4, 5, 6];
var array2 = [7, 8, 1, 2, 9, 10];

/* run a filter function for every value in array2 and returned the final filtered array */
var array3 = array2.filter(function(currentValue, index, arr){
      return (array1.indexOf(currentValue) === -1); /* this will check whether currentValue exists in aray1 or not. */
});

console.log(array3) /* filtered array */

This should deliver what you want. Or another way:

var array1 = [0, 1, 2, 3, 4, 5, 6];
var array2 = [7, 8, 1, 2, 9, 10];
var duplicateRemoved = [];
/* run a function for every value in array2 and collect the unique value in a new array */
array2.forEach(function(currentValue, index, arr){
      if (array1.indexOf(currentValue) === -1) {
          duplicateRemoved.push(currentValue);
      }
});

console.log(duplicateRemoved)

This should work in your situation unless there are some other external factors associated with it.

asmmahmud
  • 4,844
  • 2
  • 40
  • 47
  • Actually I thought this was working but it's returning the same array. Is there a way I can compare the slugs inside the array, not the index? – Jake K Aug 08 '17 at 12:41