Heim > Web-Frontend > js-Tutorial > Deduplizierungsmethode für JavaScript-Arrays

Deduplizierungsmethode für JavaScript-Arrays

小云云
Freigeben: 2017-11-27 09:24:50
Original
1373 Leute haben es durchsucht

Wir alle wissen, dass verschiedene Programmiersprachen über Array-Deduplizierung verfügen. In diesem Artikel werden wir über die JavaScript-Array-Deduplizierung sprechen und hoffen, allen zu helfen.

Doppelschichtschleife

Vielleicht denken wir zuerst daran, indexOf zu verwenden, um das Urteil zu durchlaufen, aber vor dieser Methode werfen wir einen Blick auf die originellste Methode:

var array = [1, 1, '1', '1'];function unique(array) {    // res用来存储结果
    var res = [];    for (var i = 0, arrayLen = array.length; i < arrayLen; i++) {        for (var j = 0, resLen = res.length; j < resLen; j++ ) {            if (array[i] === res[j]) {                break;
            }
        }        // 如果array[i]是唯一的,那么执行完循环,j等于resLen
        if (j === resLen) {
            res.push(array[i])
        }
    }    return res;
}console.log(unique(array)); // [1, "1"]
Nach dem Login kopieren

In dieser Methode verwenden wir Schleifenverschachtelung, das äußerste Schleifenarray und das innere Schleifenarray res. Wenn der Wert von array[i] gleich dem Wert von res[j] ist, springen wir aus Wenn sie nicht gleich sind, erklären Sie, dass der Wert von j zu diesem Zeitpunkt gleich der Länge von res ist, und addieren Sie den Wert zu res.

Es scheint sehr einfach zu sein, dass ich über diese Methode sprechen möchte, weil sie eine gute Kompatibilität aufweist!

indexOf

Wir können indexOf verwenden, um die innere Schleife zu vereinfachen:

var array = [1, 1, &#39;1&#39;];function unique(array) {    var res = [];    for (var i = 0, len = array.length; i < len; i++) {        var current = array[i];        if (res.indexOf(current) === -1) {
            res.push(current)
        }
    }    return res;
}console.log(unique(array));
Nach dem Login kopieren

Deduplizierung nach dem Sortieren

Stellen Sie sich vor, wir deduplizieren zuerst das Array Wenn Sie die Sortiermethode verwenden, werden dieselben Werte zusammensortiert. Dann können wir nur beurteilen, ob das aktuelle Element mit dem vorherigen Element übereinstimmt. Fügen Sie sie zu res hinzu. Schreiben wir eine Demo:

var array = [1, 1, &#39;1&#39;];function unique(array) {    var res = [];    var sortedArray = array.concat().sort();    var seen;    for (var i = 0, len = sortedArray.length; i < len; i++) {        // 如果是第一个元素或者相邻的元素不相同
        if (!i || seen !== sortedArray[i]) {
            res.push(sortedArray[i])
        }
        seen = sortedArray[i];
    }    return res;
}console.log(unique(array));
Nach dem Login kopieren

Wenn wir ein sortiertes Array deduplizieren, ist diese Methode definitiv effizienter als die Verwendung von indexOf.

unique API

Nachdem wir diese beiden Methoden kennen, können wir versuchen, eine Tool-Funktion namens Unique zu schreiben. Wir bestimmen, ob das eingehende Array anhand eines Parameters dupliziert wird. Wir werden beurteilen, ob die benachbarten Elemente gleich sind. Wenn dies falsch ist, verwenden wir indexOf, um zu beurteilen

var array1 = [1, 2, &#39;1&#39;, 2, 1];var array2 = [1, 1, &#39;1&#39;, 2, 2];// 第一版function unique(array, isSorted) {    var res = [];    var seen = [];    for (var i = 0, len = array.length; i < len; i++) {        var value = array[i];        if (isSorted) {            if (!i || seen !== value) {
                res.push(value)
            }
            seen = value;
        }        else if (res.indexOf(value) === -1) {
            res.push(value);
        }        
    }    return res;
}console.log(unique(array1)); // [1, 2, "1"]console.log(unique(array2, true)); // [1, "1", 2]
Nach dem Login kopieren

Optimierung

Obwohl unqique bereits die Deduplizierungsfunktion ausprobieren kann, um Um diese API leistungsfähiger zu machen, betrachten wir eine Anforderung:

Neue Anforderung: Die Groß- und Kleinschreibung von Buchstaben gelten als konsistent, z. B. „a“ und „A“, behalten Sie einfach eine bei!

Obwohl wir zuerst alle Daten im Array verarbeiten können, z. B. alle Buchstaben in Kleinbuchstaben umwandeln, und sie dann an die Unique-Funktion übergeben können, gibt es eine Möglichkeit, diese Schleife der Array-Verarbeitung einfach zu speichern Machen Sie es direkt? Wie wäre es mit einem Deduplizierungszyklus? Erfüllen wir diese Anforderung:

var array3 = [1, 1, &#39;a&#39;, &#39;A&#39;, 2, 2];// 第二版// iteratee 英文释义:迭代 重复function unique(array, isSorted, iteratee) {    var res = [];    var seen = [];    for (var i = 0, len = array.length; i < len; i++) {        var value = array[i];        var computed = iteratee ? iteratee(value, i, array) : value;        if (isSorted) {            if (!i || seen !== value) {
                res.push(value)
            }
            seen = value;
        }        else if (iteratee) {            if (seen.indexOf(computed) === -1) {
                seen.push(computed);
                res.push(value);
            }
        }        else if (res.indexOf(value) === -1) {
            res.push(value);
        }        
    }    return res;
}console.log(unique(array3, false, function(item){    return typeof item == &#39;string&#39; ? item.toLowerCase() : item
})); // [1, "a", 2]
Nach dem Login kopieren

In dieser und der letzten Version der Implementierung übergibt die Funktion drei Parameter:

Array: stellt das Array zum Entfernen von Duplikaten dar, das „Fill“ sein muss in

isSorted: Gibt an, ob das von der Funktion übergebene Array sortiert wurde. Wenn dies der Fall ist, wird eine schnellere Methode zum Entfernen von Duplikaten verwendet.

iteratee: Übergeben Sie eine Funktion, die kann das Array neu berechnen und dann entsprechend den Verarbeitungsergebnissen deduplizieren.

An dieser Stelle haben wir eine einzigartige Funktion geschrieben, die der Idee des Unterstrichs folgt. Weitere Informationen finden Sie auf Github.

filter

ES5 stellt die Filtermethode bereit, mit der wir die äußere Schleife vereinfachen können:

Verwenden Sie beispielsweise die indexOf-Methode:

var array = [1, 2, 1, 1, &#39;1&#39;];function unique(array) {    var res = array.filter(function(item, index, array){        return array.indexOf(item) === index;
    })    return res;
}console.log(unique(array));
Nach dem Login kopieren

Sortiermethoden zum Entfernen von Duplikaten:

var array = [1, 2, 1, 1, &#39;1&#39;];function unique(array) {    return array.concat().sort().filter(function(item, index, array){        return !index || item !== array[index - 1]
    })
}console.log(unique(array));
Nach dem Login kopieren

Objekt-Schlüssel-Wert-Paar

Es gibt viele Methoden zum Entfernen von Duplikaten. Obwohl wir bereits eine eindeutige API nach dem Unterstrich geschrieben haben, schauen wir uns das an Bei anderen Methodenerweiterungen Untere Ansicht:

Diese Methode verwendet ein leeres Objektobjekt. Wir speichern den Wert des Arrays als Schlüsselwert des Objekts, z. B. Object[value1] = true, wenn ein anderer Wert beurteilt wird. Wenn das Objekt [Wert2] vorhanden ist, bedeutet dies, dass der Wert wiederholt wird. Der Beispielcode lautet wie folgt:

var array = [1, 2, 1, 1, &#39;1&#39;];function unique(array) {    var obj = {};    return array.filter(function(item, index, array){        return obj.hasOwnProperty(item) ? false : (obj[item] = true)
    })
}console.log(unique(array)); // [1, 2]
Nach dem Login kopieren

Wir können feststellen, dass ein Problem vorliegt, weil 1 und „1“ unterschiedlich sind, aber diese Methode beurteilt aufgrund des Schlüsselwerts von den gleichen Wert das Objekt Es kann nur eine Zeichenfolge sein, daher können wir typeof item + item verwenden, um eine Zeichenfolge als Schlüsselwert zu bilden, um dieses Problem zu vermeiden:

var array = [1, 2, 1, 1, &#39;1&#39;];function unique(array) {    var obj = {};    return array.filter(function(item, index, array)
{        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
    })
}console.log(unique(array)); // [1, 2, "1"]
Nach dem Login kopieren

ES6

Mit der Ankunft von ES6, Deduplizierung Es gab Fortschritte bei der Methode. Beispielsweise können wir Set- und Map-Datenstrukturen verwenden. Am Beispiel von Set stellt ES6 eine neue Datenstruktur bereit. Es ähnelt einem Array, aber die Werte der Mitglieder sind eindeutig und es gibt keine doppelten Werte.

Haben Sie das Gefühl, dass Sie sich darauf vorbereiten, Gewicht zu verlieren? Schreiben wir eine Version:

var array = [1, 2, 1, 1, &#39;1&#39;];function unique(array) {   return Array.from(new Set(array));
}console.log(unique(array)); // [1, 2, "1"]
Nach dem Login kopieren

Es kann sogar noch weiter vereinfacht werden:

function unique(array) {    return [...new Set(array)];
}
Nach dem Login kopieren

Es kann auch noch weiter vereinfacht werden:

var unique = (a) => [...new Set(a)]
Nach dem Login kopieren

Außerdem, wenn Sie verwenden Maps Worte:

function unique (arr) {    const seen = new Map()    return arr.filter((a) => !seen.has(a) && seen.set(a, 1))
}
Nach dem Login kopieren

Die Entwicklung von JavaScript

Wir können sehen, dass die Deduplizierungsmethode von den ursprünglichen 14 Codezeilen auf eine Codezeile von ES6 übergegangen ist, was tatsächlich veranschaulicht Die JavaScript-Sprache Ich glaube, dass die zukünftige Entwicklung mit kontinuierlichem Fortschritt immer effizienter werden wird.

Spezieller Typvergleich

Damit ist die Deduplizierungsmethode beendet. Die zu deduplizierenden Elementtypen können jedoch unterschiedlich sein, mit Ausnahme der einfachen 1 und „1“ im Beispiel. Es gibt auch null, undefiniert, NaN, Objekte usw. Was ist also das Deduplizierungsergebnis der vorherigen Methoden für diese Elemente?

Davor schauen wir uns ein paar Beispiele an:

var str1 = &#39;1&#39;;var str2 = new String(&#39;1&#39;);console.log(str1 == str2);
 // trueconsole.log(str1 === str2); // falseconsole.log(null == null);
  // trueconsole.log(null === null); // trueconsole.log(undefined == undefined);
   // trueconsole.log(undefined === undefined); // trueconsole.log(NaN == NaN);
    // falseconsole.log(NaN === NaN); // falseconsole.log(/a/ == /a/); 
    // falseconsole.log(/a/ === /a/); // falseconsole.log({} == {});
     // falseconsole.log({} === {});
      // false
Nach dem Login kopieren

Also, für ein solches Array

var array = [1, 1, &#39;1&#39;, &#39;1&#39;, null, null, undefined, undefined, new String(&#39;1&#39;), new String(&#39;1&#39;), /a/, /a/, NaN, NaN];
Nach dem Login kopieren

können die oben genannten Methoden verwendet werden, um Duplikate zu entfernen Was ist das Ergebnis?

Ich habe speziell eine Liste zusammengestellt, wir konzentrieren uns auf die Deduplizierung von Objekten und NaN:


Methodenergebnisbeschreibung


für Schleife [1, "1", null, undefiniert, String, String, /a/, /a/, NaN, NaN] Objekte und NaN werden nicht dupliziert

indexOf [1, "1", null, undefined, String, String, /a/, /a/, NaN, NaN] 对象和 NaN 不去重

sort [/a/, /a/, "1", 1, String, 1, String, NaN, NaN, null, undefined] 对象和 NaN 不去重 数字 1 也不去重

filter + indexOf [1, "1", null, undefined, String, String, /a/, /a/] 对象不去重 NaN 会被忽略掉

filter + sort [/a/, /a/, "1", 1, String, 1, String, NaN, NaN, null, undefined] 对象和 NaN 不去重 数字 1 不去重

优化后的键值对方法 [1, "1", null, undefined, String, /a/, NaN] 全部去重

Set [1, "1", null, undefined, String, String, /a/, /a/, NaN] 对象不去重 NaN 去重

想了解为什么会出现以上的结果,看两个 demo 便能明白:

// demo1var arr = [1, 2, NaN];
arr.indexOf(NaN); // -1

indexOf 底层还是使用 === 进行判断,因为 NaN ==== NaN的结果为 false,所以使用 indexOf 查找不到 NaN 元素

// demo2function unique(array) {   return Array.from(new Set(array));
}console.log(unique([NaN, NaN])) // [NaN]
Nach dem Login kopieren

Set 认为尽管 NaN === NaN 为 false,但是这两个元素是重复的。

写在最后

虽然去重的结果有所不同,但更重要的是让我们知道在合适的场景要选择合适的方法。

以上内容就是各种不同的JavaScript数组去重方法,如果大家觉得有用的话赶紧收藏起来吧。

相关推荐:

javascript数组去重/查找/插入/删除的方法

js数组去重方法汇总

JavaScript数组去重方法总结

JS实现数组去重的实例介绍

js实现数组去重的几种方法总结

Das obige ist der detaillierte Inhalt vonDeduplizierungsmethode für JavaScript-Arrays. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage