在javascript中比较两个数组并创建具有缺失和新元素的新数组

时间:2012-12-19 21:32:59

标签: javascript arrays comparison

比较两个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']

非常感谢!

3 个答案:

答案 0 :(得分:3)

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']

答案 1 :(得分:2)

我会使用Underscore.js的intersectiondifference函数。

答案 2 :(得分:0)

排序将是最有效的(假设您没有任何其他先决条件来进行优化):

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