Algorithmus zum Abrufen von Änderungen zwischen zwei Arrays
Ich musste einen Algorithmus erstellen, der (effizient) ein altes Array und ein neues Array aufnimmt und mir die Änderungen zwischen den beiden zurückgibt (welche Elemente hinzugefügt, welche entfernt wurden). Es muss in JavaScript sein (um im Browser ausgeführt zu werden), aber der Algorithmus ist wichtiger als die Sprache.
Das habe ich mir ausgedacht:http: //jsbin.com/osewu3/1. Kann jemand irgendwelche Probleme damit sehen / Verbesserungsvorschläge machen?
Vielen Dank
Code Listing:
function diff(o, n) {
// deal with empty lists
if (o == undefined) o = [];
if (n == undefined) n = [];
// sort both arrays (or this won't work)
o.sort(); n.sort();
// don't compare if either list is empty
if (o.length == 0 || n.length == 0) return {added: n, removed: o};
// declare temporary variables
var op = 0; var np = 0;
var a = []; var r = [];
// compare arrays and add to add or remove lists
while (op < o.length && np < n.length) {
if (o[op] < n[np]) {
// push to diff?
r.push(o[op]);
op++;
}
else if (o[op] > n[np]) {
// push to diff?
a.push(n[np]);
np++;
}
else {
op++;np++;
}
}
// add remaining items
if( np < n.length )
a = a.concat(n.slice(np, n.length));
if( op < o.length )
r = r.concat(o.slice(op, o.length));
return {added: a, removed: r};
}
(Ich habe dies auch als mögliche Lösung für eine andere SO-Frage veröffentlicht, hier:JavaScript Array Unterschied)