简体   繁体   English

在javascript中比较两个数组,并使用缺少的元素和新的元素创建新的数组

[英]Comparing two arrays in javascript and creating new arrays with missing and new elements

What is the most efficient way to compare two javascript arrays and create two new arrays of missing and new elements? 比较两个JavaScript数组并创建两个缺少和新元素的新数组的最有效方法是什么? 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! 谢谢一群!

The code to Drew Noakes' solution: Drew 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']

我将使用Underscore.js的交集差异函数。

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));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM