Reputation: 6041
What is the most efficient way to compare two javascript arrays and create two new arrays of missing and new elements? Array elements will be always strings or numbers and it is not 100% sure that they will be sorted in any way.
var old_array = ['11', '13', '14', '18', '22', '23', '25'];
var new_array = ['11', '13', '15', '16', '17', '23', '25', '31'];
var missing_elements = [];
var new_elements = [];
/*
* some magic goes here
* which compares
* new_array with old_array
*/
console.log(missing_elements); // would produce ['14', '18', '22']
console.log(new_elements); // would produce ['15', '16', '17', '31']
Thanks a bunch!
Upvotes: 2
Views: 1285
Reputation: 9845
The code to Drew Noakes' solution:
var old_array = ['11', '13', '14', '18', '22', '23', '25'];
var new_array = ['11', '13', '15', '16', '17', '23', '25', '31'];
var missing_elements = _.difference(old_array, new_array);
var new_elements = _.difference(new_array, old_array);
console.log(missing_elements); // would produce ['14', '18', '22']
console.log(new_elements); // would produce ['15', '16', '17', '31']
Upvotes: 3
Reputation: 664650
Sorting will be the most efficient (assuming you don't have any other preconditions to base an optimization on):
var old_array_sorted = old_array.slice().sort(); // slicing for not mutating
var new_array_sorted = new_array.slice().sort(); // the original array
for (var o=0, n=0; o<old_array_sorted.length && n<new_array_sorted.length; ) {
if (old_array_sorted[o] < new_array_sorted[n])
missing_elements.push ( old_array_sorted[o++] );
else if (old_array_sorted[o] > new_array_sorted[n])
new_elements.push( new_array_sorted[n++] );
else
n++, o++;
}
[].push.apply(missing_elements, old_array_sorted.slice(o));
[].push.apply(new_elements, new_array_sorted.slice(n));
Upvotes: 0
Reputation: 311057
I would use Underscore.js's intersection and difference functions.
Upvotes: 2