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)

Antworten auf die Frage(16)

Ihre Antwort auf die Frage