Vorwort
Um den Job zu wechseln und mich auf ein Vorstellungsgespräch vorzubereiten, habe ich gestern Nachmittag damit begonnen, JavaScript-bezogenes Wissen zu überprüfen und über die damit verbundenen Methoden der Array-Deduplizierung nachzudenken, also habe ich einfach ein paar Artikel über JavaScript-Algorithmen zusammengestellt Die zukünftige Verwendung dieser Artikelserie ist ungewiss, ich werde schreiben, wo immer ich denke, keine Garantie für Richtigkeit, keine Garantie für hohe Effizienz, nur über persönliches Verständnis sprechen, wenn es irgendwelche Fehler gibt, korrigieren Sie mich bitte.
Informationen zum Entfernen von Duplikaten
Array-Deduplizierung ist ein häufiger Algorithmus-Inspektionspunkt, und der Weg zur Deduplizierung ist nichts anderes als Einzigartigkeit und Nicht-Einzigartigkeit. Vereinfacht ausgedrückt bedeutet es, die Eindeutigen auszuwählen oder die Nicht-Einzigartigen zu löschen. Alle folgenden Algorithmen wurden von mir blind benannt, bitte ignorieren Sie sie.
Schleifenabgleich zum Entfernen von Duplikaten
Wie der Name schon sagt, wird jedes Element im Array mit dem Array verglichen, in dem das Element gespeichert ist. Wenn es auf sich nicht wiederholende Elemente stößt, wird es bis zum Ende der Schleife in ein neues Array eingefügt kann auch als Double-Loop-Matching bezeichnet werden. Das Entfernen von Duplikaten ist die einfachste Möglichkeit, die sich jeder vorstellen kann.
Implementierungscode:
var arr=[1,3,4,56,3,7,9,7]; var result=[]; //匹配 function isMatch(array,n){ for(var i=0;i<array.length;i++){ if(array[i]==n){ return true; } } return false; }; //验证所有元素 function unqiue(array){ for(var i=0;i<array.length;i++){ if(!isMatch(result,array[i])){ result.push(array[i]); } } return result; }; console.log(unqiue(arr));
Hinweis: Bei der oben genannten Methode gibt es einen Fehler. Wenn Zahlen und numerische Zeichenfolgen vorhanden sind, wird zwischen Zahlen und numerischen Zeichenfolgen nicht unterschieden. Da in der Matching-Funktion isMatch() die doppelte Gleichheit „==" verwendet wird und der Elementtyp nicht überprüft wird, sollte eigentlich kongruent „===" verwendet werden.
Der geänderte Code lautet wie folgt:
var arr=[1,3,4,56,3,'1',7,9,7]; var result=[]; //匹配 function isMatch(array,n){ for(var i=0;i<array.length;i++){ if(array[i]===n){ return true; } } return false; }; //验证所有元素 function unqiue(array){ for(var i=0;i<array.length;i++){ if(!isMatch(result,array[i])){ result.push(array[i]); } } return result; }; console.log(unqiue(arr));
Vor- und Nachteile des Algorithmus:
Vorteile:
Einfache Umsetzung und intuitives Denken
Nachteile:
Ineffizienz
JSON-Deduplizierung/Objekt-Deduplizierung/Wörterbuch-Deduplizierung
JSON-Deduplizierung besteht einfach ausgedrückt darin, die Einzigartigkeit des Objekt-Objektschlüssels zu nutzen, um die Elemente des Arrays in JSON oder den Schlüsselwert des Objekts zu konvertieren. Der JSON-Wert speichert den Indexindex des Arrays, führt dann eine for-in-Schleife für das JSON-Objekt aus und speichert es in einem neuen Array.
Array, JSON und {} sind alles Objekte, daher kann dieser Algorithmus mit jedem beliebigen Objekt implementiert werden.
Implementierungscode:
Array-Modus:
var arr=[1,3,4,56,3,'1',7,9,7]; function unqiue(array){ var cache=[]; var result=[]; //将数组元素转为对象的key for(var i=0;i<array.length;i++){ cache[array[i]]=i; }; //存储key(实际的数组元素) for(key in cache){ result.push(key); }; return result; } console.log(unqiue(arr));
JSON-Modus:
var arr=[1,3,4,56,3,'1',7,9,7]; function unqiue(array){ var cache={}; var result=[]; //将数组元素转为对象的key for(var i=0;i<array.length;i++){ cache[array[i]]=i; }; //存储key(实际的数组元素) for(key in cache){ result.push(key); }; return result; } console.log(unqiue(arr));
Objektmodus:
var arr=[1,3,4,56,3,'1',7,9,7]; function unqiue(array){ var cache=new Object(); var result=[]; //将数组元素转为对象的key for(var i=0;i<array.length;i++){ cache[array[i]]=i; }; //存储key(实际的数组元素) for(key in cache){ result.push(key); }; return result; } console.log(unqiue(arr));
Vor- und Nachteile des Algorithmus:
Vorteile:
Einfach
Sehr effizient
Nachteile:
1. Der Typ der Array-Elemente () wurde geändert
2. Es liegt ein Fehler vor (nichts anderes als die Unterscheidung zwischen Zahlen und numerischen Zeichenfolgen)
Rekursive Deduplizierung in der Warteschlange
Ich habe gestern Abend lange darüber nachgedacht und mir überlegt, das Array zunächst in aufsteigender oder absteigender Reihenfolge in eine Warteschlange zu sortieren, sodass sich dieselben Elemente in einem Bereich befinden, und dann vom Ende an abzugleichen Wenn die Übereinstimmung erfolgreich ist, wird das Ende der Warteschlange gelöscht, und das vorherige Element stimmt mit dem vorherigen Element überein. Nachdem der gesamte Abgleich abgeschlossen ist, bilden die verbleibenden Elemente die deduplizierte Warteschlange.
var arr=[6, 4, 6, 9, '6', 13, 56, 9, ,'11',1, 8, '7', 17, 5, 45, 3, 7]; function unqiue(array){ //排序数组,形成队列 array.sort(function(m,n){return m-n;}); ////排序后,队尾向前对比,如果相同,删除队尾,依次类推 function loop(Index){ if(Index>=1){ if(array[Index]===array[Index-1]){ arr.splice(Index,1); } loop(Index-1); } } loop(array.length-1); return array; } console.log(unqiue(arr));
Vor- und Nachteile des Algorithmus:
Vorteile:
Höhere Effizienz
Nachteile:
Nicht die effizienteste
INDEXOF-Deduplizierungsmethode
Stellen Sie fest, ob der Browser indexOf unterstützt. indexOf ist eine neue Methode von ecmaScript5. Sie wird von IE8 und niedriger nicht unterstützt (einschließlich IE8, IE8 unterstützt nur einen Teil von ecma5)
if (!Array.prototype.indexOf){ // 新增indexOf方法 Array.prototype.indexOf = function(item){ var result = -1, a_item = null; if (this.length == 0){ return result; } for(var i = 0, len = this.length; i < len; i++){ a_item = this[i]; if (a_item === item){ result = i; break; } } return result; } }