2

2 つの JavaScript 配列を比較し、欠落要素と新しい要素の 2 つの新しい配列を作成する最も効率的な方法は何ですか? 配列要素は常に文字列または数値であり、それらが何らかの方法でソートされることは 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']

本当にありがとう!

4

3 に答える 3

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']
于 2012-12-19T21:55:03.760 に答える
2

Underscore.js の交差関数と差分関数を使用します。

于 2012-12-19T21:40:53.587 に答える
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));
于 2012-12-19T21:44:50.447 に答える