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.
比较两个javascript数组并创建两个缺失和新元素的新数组,最有效的方法是什么?数组元素总是字符串或数字,并且不能100%确定它们将以任何方式排序。
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!
多谢!
3 个解决方案
#1
3
The code to Drew Noakes' solution:
绘制Noakes解决方案的代码:
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']
#3
0
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));
#1
3
The code to Drew Noakes' solution:
绘制Noakes解决方案的代码:
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']
#2
#3
0
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));