Ich habe heute auch danach gesucht und Folgendes gefunden:
http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256BFB0077DFFD
Ich weiß nicht, ob dies eine gute Lösung ist, obwohl einige Leistungsaspekte berücksichtigt werden.
Ich mag die Idee einer jQuery-Hilfsmethode. @ David Ich würde lieber sehen, dass Ihre Vergleichsmethode wie folgt funktioniert:
jQuery.compare(a, b)
Es macht für mich keinen Sinn, Folgendes zu tun:
$(a).compare(b)
wobei a und b Arrays sind. Normalerweise würden Sie beim $ (etwas) eine Auswahlzeichenfolge übergeben, um mit DOM-Elementen zu arbeiten.
Auch in Bezug auf das Sortieren und "Zwischenspeichern" der sortierten Arrays:
- Ich denke nicht, dass das einmalige Sortieren zu Beginn der Methode statt jedes Mal durch die Schleife 'Caching' ist. Die Sortierung erfolgt weiterhin jedes Mal, wenn Sie compare (b) aufrufen. Das ist nur Semantik, aber ...
- for (var i = 0; t [i]; i ++) { ... diese Schleife wird vorzeitig beendet, wenn Ihr t- Array irgendwo einen falschen Wert enthält, also $ ([1, 2, 3, 4]). compare ( [1, false, 2, 3]) gibt true zurück !
- Noch wichtiger ist, dass die Array sort () -Methode das Array an Ort und Stelle sortiert. Wenn Sie also var b = t.sort () ... ausführen, wird keine sortierte Kopie des ursprünglichen Arrays erstellt, sondern das ursprüngliche Array sortiert und auch ein Verweis auf zugewiesen es in b . Ich denke nicht, dass die Vergleichsmethode Nebenwirkungen haben sollte.
Es scheint, dass wir die Arrays kopieren müssen, bevor wir daran arbeiten. Die beste Antwort, die ich finden konnte, um das auf jQuery-Weise zu tun, war von niemand anderem als John Resig hier auf SO! Was ist der effizienteste Weg, um ein Objekt in JavaScript tief zu klonen? (Siehe Kommentare zu seiner Antwort für die Array-Version des Objektklonrezepts)
In diesem Fall denke ich, wäre der Code dafür:
jQuery.extend({
compare: function (arrayA, arrayB) {
if (arrayA.length != arrayB.length) { return false; }
// sort modifies original array
// (which are passed by reference to our method!)
// so clone the arrays before sorting
var a = jQuery.extend(true, [], arrayA);
var b = jQuery.extend(true, [], arrayB);
a.sort();
b.sort();
for (var i = 0, l = a.length; i < l; i++) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
}
});
var a = [1, 2, 3];
var b = [2, 3, 4];
var c = [3, 4, 2];
jQuery.compare(a, b);
// false
jQuery.compare(b, c);
// true
// c is still unsorted [3, 4, 2]
[0,1] == {0:0,1:1,length=2}