Bei der Durchführung von Array -Operationen stoßen Sie häufig auf das Problem der Entfernung von Duplikaten. Das Folgende ist eine kurze Einführung in die Methode der Deduplizierung von Arrays.
Indexof Deduplizierung
Array.Prototype.unique1 = function () {var arr = [] []; für (var i = 0; i <this.Length; i ++) {var item = this [i]; if (arr.indexof (item) === -1) {arr.push (item);}} zurücksend arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique1 (); // [1, 2, 3, "4", 4, "34"]Unter IE6-8 existiert jedoch die Index-Methode von Array noch nicht (obwohl dies ein bisschen alt ist, Os (∩__∩) o ~), aber Programmierer müssen eine Indexof-Methode schreiben:
var indexof = [] .Indexof? function(arr, item) {return arr.indexOf(item);} :function indexOf(arr, item) {for (var i = 0; i < arr.length; i++) {if (arr[i] === item) {return i;}}return -1;}Array.prototype.unique2 = function() {var arr = [];for (var i = 0; i < this.length; i++) {var item = this [i]; if (arr.indexof (item) === -1) {arr.push (item);}} return arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique2 (); // [1, 2, 3, "4", 4, "34"]Indexof kann auch diese Art der Wiederaufstellung verwenden:
Array.Prototype.unique3 = function () {var arr = [this [0]]; für (var i = 1; i <this.Length; i ++) {if (this.indexof (this [i]) == i) {arr.push (this [i]);}} arr;} [1,2,3, '4', 3,4,3, '34 ', 2] .uniquique3 (); // [1, 2, 3, "4", 4, "34"]Hash zu neu laden
Der oben genannte Index ist korrekt, aber in Bezug auf die Leistung verringert der Doppelzyklus die Leistung. Dann benutzen wir Hash.
Array.Prototype.unique4 = function () {var arr = []; var hash = {}; für (var i = 0; i <this.Length; i ++) {var item = this [i]; var key = typeof (item)+itemif (Hash [taste]! arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique4 (); // [1, 2, 3, "4", 4, "34"]Der Kern besteht darin, ein Hash -Objekt zum Ersetzen von Indexof zu erstellen. Raum zu Zeit ändern. Beachten Sie, dass in JavaScript der Schlüsselwert eines Objekts nur eine Zeichenfolge sein kann (natürlich liefert ES6 eine Kartendatenstruktur. Er ist einem Objekt ähnlich und ist auch eine Sammlung von Schlüsselwertpaaren, aber der Umfang der "Schlüssel" ist nicht auf Strings beschränkt. Alle Arten von Werten (einschließlich Objekte) können als Schlüsseln angesehen werden. In anderen Worten bietet die Objektstruktur eine "Zeichenstruktur". Dies ist eine vollständigere Hash -Struktur -Darstellung.), Daher wird var key = typeof (item) + item benötigt, um zwischen dem Wert 1 und der Zeichenfolge '1' zu unterscheiden.
Wenn Sie dann möchten, dass '4' und 4 als gleich betrachtet werden (die anderen Ansätze sind gleich)
Array.Prototype.unique5 = function () {var arr = []; var hash = {}; für (var i = 0, len = this.Length; i <len; i ++) {if (! Hash [this [i]]) {arr.push (this [i]); arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique5 (); // [1, 2, 3, "4", "34"]Nach dem Sortieren De-Repeat
Array.Prototype.unique6 = function () {this.sort (); var arr = [this [0]]; for (var i = 1; i <this.Length; i ++) {if (this [i]! == arr.Length-1]) {arr.push (this [i]); arr;} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique6 (); // [1, 2, 3, "34", "4", 4]Sortieren Sie zuerst das Array und vergleichen Sie dann zwei benachbarte Werte. Verwenden Sie beim Sortieren die JS Native Sortiermethode, damit sie sehr schnell ist. Es gibt nur einen Nachteil dieser Methode, und die Zeichen werden beim Vergleich von Zeichen in der Reihenfolge der Charaktercodierung sortiert. Sie werden also sehen, dass 10 in 2. Rang zuerst eingestuft wird. Dies beeinträchtigt jedoch die Entfernung von schwerem Gewicht jedoch nicht. Um das Sortierproblem zu lösen, akzeptiert die Sortiermethode jedoch einen Parameter, bei dem es sich um eine Methode handelt:
Funktion compare (value1, value2) {if (value1 <value2) {return -1;} else if (value1> value2) {return 1;} else {return 0;}} [1,2,5,2,10,30] .sort (compare); // [1, 2, 2, 3, 5, 10, 20]Auf das Nachladen einstellen
ES6 bietet einen neuen Datenstruktursatz. Es ähnelt einem Array, aber die Werte der Mitglieder sind alle einzigartig, ohne doppelte Werte. Der Browser ist jetzt vollständig unterstützt und der Serverknoten wird ebenfalls unterstützt.
Array.Prototype.unique7 = function () {return array.from (neuer set (this));} [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique7 (); // [1, 2, 3, "4", 4, "34"]Methodenbibliothek
Empfohlen eine Method Library Undercore.js, die im Knoten oder im Browser JS sehr beliebt ist.
const _ = fordern ('unterstrich'); _. Uniq ([1, 2, 1, 3, 1, 4]); // [1, 2, 3, 4]Testzeit
Alle oben genannten Methoden können auf einfache Weise getestet werden und dann die besten Methoden vergleichen und auswählen:
console.time ("test"); [1,2,3, '4', 3,4,3,1, '34 ', 2] .unique7 (); console.timeend ("Test"); ==> VM314: 3 Test: 0,378msUm die Daten größer zu machen, erstellen Sie zufällig 1 Million Zahlen:
var arr = []; var num = 0; für (var i = 0; i <1000000; i ++) {num = math.floor (math.random ()*100); arr.push (num);} console.time ("test"); arr.unique7 (); console.timeend ("test");Das obige ist die JavaScript -Array -Deduplizierung, die der Editor Ihnen von langsam zu schnell von Medium bis einfach vorgestellt hat. Ich hoffe, es wird Ihnen hilfreich sein. Wenn Sie Fragen haben, hinterlassen Sie mir bitte eine Nachricht und der Editor wird Ihnen rechtzeitig antworten. Vielen Dank für Ihre Unterstützung auf der Wulin.com -Website!