test
test

Reputation: 18198

JavaScript - Filter out two arrays and take out dupes

Let's say I have two arrays:

var sellersDatabase = [
  { name: 'Mark', start_date: '2017-06-27' },
  { name: 'Jane', start_date: '2017-06-27' }
];

var sellersAPICall = [
  { name: 'Mark', start_date: '2017-06-27' },
  { name: 'Joe', start_date: '2017-06-22' },
  { name: 'Steven', start_date: '2017-04-11' },
  { name: 'Jane', start_date: '2017-06-27' }
];

How would, using either ES6 or Lodash, get the difference of those not included in the first array? Yes, I've tried lodash's difference().

So, my expected output would be:

var toInsertIntoDB = [
  { name: 'Joe', start_date: '2017-06-22' },
  { name: 'Steven', start_date: '2017-04-11' }
];

Doing this:

javascript const toInsertToDB = _.difference(sellersDatabase, sellersAPICall); console.log(toInsertToDB);

outputs:

[{ "name": "Mark", "start_date": "2017-06-27" }, { "name": "Jane", "start_date": "2017-06-27" }]

(when I want the opposite)

Upvotes: 0

Views: 41

Answers (1)

Ori Drori
Ori Drori

Reputation: 193358

Since you are comparing array of objects, and not primitives, use _.differenceBy(), and state by which property the object should be compared. In addition the sellersAPICall array should be the 1st (the reference array).

var sellersDatabase = [
  { name: 'Mark', start_date: '2017-06-27' },
  { name: 'Jane', start_date: '2017-06-27' }
];

var sellersAPICall = [
  { name: 'Mark', start_date: '2017-06-27' },
  { name: 'Joe', start_date: '2017-06-22' },
  { name: 'Steven', start_date: '2017-04-11' },
  { name: 'Jane', start_date: '2017-06-27' }
];

var result = _.differenceBy(sellersAPICall, sellersDatabase, 'name');

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

And if you want to compare 2 properties, you can use a callback function that concatenates both values:

var sellersDatabase = [
  { name: 'Mark', start_date: '2017-06-27' },
  { name: 'Jane', start_date: '2017-06-27' }
];

var sellersAPICall = [
  { name: 'Mark', start_date: '2017-06-27' },
  { name: 'Joe', start_date: '2017-06-22' },
  { name: 'Steven', start_date: '2017-04-11' },
  { name: 'Jane', start_date: '2017-06-27' }
];

var result = _.differenceBy(sellersAPICall, sellersDatabase, function(o) {
  return o.name + '-' + o.start_date;
});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

Upvotes: 5

Related Questions