Heim > Web-Frontend > js-Tutorial > JavaScript-Thema 2: Array-Deduplizierung

JavaScript-Thema 2: Array-Deduplizierung

coldplay.xixi
Freigeben: 2021-03-03 10:23:45
nach vorne
1671 Leute haben es durchsucht

🔜

Sechs, ES6. Sieben, einige Fragen

const unique = (arr)=>{
    for(let i = 0; i {
    var arr = [1, '1', '1', 1, 2, true, false, true, 3, 2, 2, 1];
    var newArr = [];
    for(let i = 0; i  <img  src="https://img.php.cn/upload/article/202103/03/2021030310181952664.jpg" alt="JavaScript-Thema 2: Array-Deduplizierung" >Kernpunkt:<p><strong></strong></p>Zeitkomplexität: <code>O(n^2)</code>
Nach dem Login kopieren
  • Die beiden oben genannten Methoden sind zwei Schleifendurchläufe mit leicht unterschiedlichen Verarbeitungsmethoden
  • Die obige Implementierungsmethode Das ist es tatsächlich Nicht die beste Wahl, aber aufgrund der guten Kompatibilität besser Wenn Sie das ursprüngliche Array zurückgeben müssen, können Sie splice verwenden, um
  • indexOf zu entfernen, wenn die Methode <code>indexOf ein doppeltes Element findet (ungleich). die Position, an der es zum ersten Mal erschien. Code>: Gibt den ersten Index zurück, an dem ein bestimmtes Element im Array gefunden werden kann, oder -1, wenn es nicht existiert.
  • indexOf(ele, fromIndex)
  • ele: Das zu findende Element
  • fromIndex: Die Startposition des zu findenden Elements, der Standardwert ist 0, negative Zahlen sind zulässig, -2 bedeutet beginnend beim vorletzten Element
  • Gibt einen Index (Zahl) zurück )
  • Code:
const unique = (arr) => {
    var res = [];
    for (let i = 0; i <h5>2.2 enthält eine vereinfachte einstufige Schleifenbeurteilung</h5><p><a href="//m.sbmmt.com/course/list/17.html" target="_blank" textvalue="javascript视频教程">Kernpunkt: </a></p><p><img src="https://img.php.cn/upload/article/000/000/052/87e1933471f3a5888c03aeb3f63d42fb-0.jpg" alt="JavaScript-Thema 2: Array-Deduplizierung">Sie können es selbst kombinieren, ob Sie das ursprüngliche Array zurückgeben möchten oder ein neues Array~</p><p><code> Includes</code>: Wird verwendet, um zu bestimmen, ob ein Array einen angegebenen Wert enthält. Geben Sie je nach Situation <code>true</code> zurück, andernfalls geben Sie <code> zurück false</code><strong></strong><code>includes (ele, fromIndex)</code>
 </p><p>ele: Das zu findende Element <strong></strong>fromIndex: Suche am angegebenen Index starten. Der Standardwert ist 0. Wenn er negativ ist, wird der Absolutwertindex von <code>fromIndex</code> vom Ende nach vorne gesprungen. . </p>
Nach dem Login kopieren
    Return result (bool)
  • O(n^2)
  • 上面的两种方法都是两次循环遍历,处理方式略有不同
  • 上述实现方式确实不是最佳选择,但它胜在兼容性好啊~

二、indexOf和includes

2.1 indexOf简化一层循环判断

核心点:

  • 如果需要返回原数组,则可以在indexOf方法找到重复项时(不等于它首次出现的位置)时利用splice移除
  • indexOf:返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。
  • indexOf(ele, fromIndex)  
    • ele:要查找的元素
    • fromIndex:查找元素的起始位置,默认为0,允许负数,-2表示从倒数第二个元素开始查找
    • 返回一个下标(number)

代码:

const unique = (arr) => {
    var res = [];
    for (let i = 0; i <h5>2.2 includes简化一层循环判断</h5><p><strong>核心点:</strong></p>
Nach dem Login kopieren
  • 具体的是要返回原数组还是新数组大家可以自行组合~
  • includes:用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false
  • includes(ele, fromIndex)  
    • ele:要查找的元素
    • fromIndex:指定索引处开始查找。默认为 0,如果为负值,从末尾开始往前跳 fromIndex 的绝对值个索引。。
    • 返回结果(bool)

代码:

if(res.indexOf(arr[i]) !== -1 ){ todo }// orif(res.includes(arr[i])){ todo }
Nach dem Login kopieren
2.3 indexOf和includes对于当前场景的选择

在这里我们推荐使用includes来查找元素:

返回值可以直接作为if的条件语句,简洁

var arr = [NaN, NaN];arr.indexOf(NaN); // -1arr.includes(NaN); // true
Nach dem Login kopieren

识别NaN

如果数组中有NaN,你又正好需要判断数组是否有存在NaN,这时你使用indexOf是无法判断的,你必须使用includes这个方法。

var arr = new Array(3);console.log(arr.indexOf(undefined)); //-1console.log(arr.includes(undefined)) //true
Nach dem Login kopieren

识别undefined

如果数组中有undefined值,includes会认为空的值是undefined,而indexOf不会。

var arr = [1, 1, '1'];function unique(arr) {
    var res = [];
    var sortedArr = arr.concat().sort();
    var last;
    for (var i = 0; i <p><strong>三、排序去重</strong></p><p><strong>核心点:</strong></p>
Nach dem Login kopieren
  • 数组排序后,相同的元素会相邻,所以如果当前元素与它的相邻元素不同,就存入到新数组中;
  • 相比于indexOf,只需要一层循环;
  • concat会拼接数组,并返回新数组;
  • sort()排序是通过按照转换为的字符串的各个字符的Unicode位点进行排序。所以很难保证它的准确性;

代码:

var arr = [1, 2, 1, 1, '1'];const unique = function (arr) {
    var res = arr.filter(function(item, index, arr){
        return arr.indexOf(item) === index;
    })
    return res;}console.log(unique(arr)); // [ 1, 2, '1' ]
Nach dem Login kopieren

四、filter

核心点:

  • filter:方法创建一个新数组, 其包含通过所提供函数实现的测试的所有元素(返回测试函数成立的元素)
  • filter(callback, thisArg)
    • callback接受三个参数:element-当前正在处理的元素,index-当前元素索引,array-调用了filter的数组本身
    • thisArg:执行 callback 时,用于 this 的值。
      利用filter我们可以在代码层面简化一下外层循环:

代码:

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

结合排序的思路:

var arr = [1, 2, 1, 1, '1', 3, 3];const unique = function(arr) {
    var obj = {};
    var res = [];
    arr.forEach(item => {
        if (!obj[item]) {
            obj[item] = true;
            res.push(item);
        }
    });
    return res;}console.log(unique(arr)); // [1, 2, 3]
Nach dem Login kopieren
Nach dem Login kopieren

五、键值对(key-value)

前面提到的几种方式总结下来大致分为

  1. 非排序数组,两次遍历判断(遍历、查询)
  2. 排序数组,相邻元素比较

我们再提出一种方式,利用Object对象 key-value的方式,来统计数组中元素出现的个数,初步判断逻辑也有两种

[1,1,1,2,2,3,'3']

🎜🎜🎜Code: 🎜🎜
var arr = [1, 2, 1, 1, '1'];const unique = function(arr) {
    var obj = {};
    return arr.filter(function(item, index, arr){
        return obj.hasOwnProperty(item) ? false : (obj[item] = true)
    })}console.log(unique(arr)); // [1, 2]
Nach dem Login kopieren
Nach dem Login kopieren
2.3 indexOf und Includes für die Auswahl der aktuellen Szene
🎜Hier empfehlen wir die Verwendung von Includes, um Elemente zu finden: 🎜🎜🎜Return value Kann direkt als bedingte Anweisung von if verwendet werden, prägnant🎜🎜
var arr = [1, 2, 1, 1, '1', 3, 3, '2'];const unique = function(arr) {
    var obj = {};
    var res = [];
    arr.forEach(item => {
        if (!obj[typeof item + item]) {
            obj[typeof item + item] = true;
            res.push(item);
        }
    });
    return res;}console.log(unique(arr)); // [ 1, 2, '1', 3, '2' ]
Nach dem Login kopieren
Nach dem Login kopieren
🎜🎜Identifizieren Sie NaN🎜🎜🎜Wenn das Array NaN enthält, müssen Sie es nur tun Bestimmen Sie, ob das Array vorhanden ist NaN, dann ist es unmöglich festzustellen, ob Sie indexOf verwenden. Sie müssen die Methode includes verwenden. 🎜
var arr = [1, 2, 1, '1', '2'];const unique = function(arr) {
   return Array.from(new Set(arr));}console.log(unique(arr)); // [ 1, 2, '1', '2' ]
Nach dem Login kopieren
Nach dem Login kopieren
🎜🎜Erkennt undefiniert🎜🎜🎜Wenn das Array einen undefinierten-Wert enthält, betrachtet includes den 🎜leeren Wert als undefiniert 🎜, und indexOf nicht. 🎜
function unique(array) {
    return [...new Set(array)];}
Nach dem Login kopieren
Nach dem Login kopieren
🎜🎜3. Sortieren und Deduplizieren🎜🎜🎜🎜Kernpunkt: 🎜🎜🎜🎜Nachdem das Array sortiert wurde, liegen dieselben Elemente nebeneinander. Wenn sich das aktuelle Element also von seinen angrenzenden Elementen unterscheidet, werden sie darin gespeichert das neue Array ;🎜🎜Im Vergleich zu indexOf ist nur eine Schleife erforderlich; 🎜🎜concat fügt Arrays zusammen und gibt ein neues Array zurück; 🎜🎜sort() basiert auf den Unicode-Bits jedes Zeichens der konvertierten -Zeichenfolge Zum Sortieren. Daher ist es schwierig, die Genauigkeit zu garantieren. 🎜🎜🎜🎜Code: 🎜🎜
var unique = (a) => [...new Set(a)]
Nach dem Login kopieren
Nach dem Login kopieren
🎜🎜Vier, Filter🎜🎜🎜🎜Kernpunkt: 🎜🎜🎜🎜Filter: Die Methode erstellt ein neues Array, das den bereitgestellten enthält Alle Elemente des Tests, die von der Funktion implementiert werden (gibt das Element zurück, für das die Testfunktion erstellt wird) 🎜🎜filter(callback, thisArg): 🎜🎜callback akzeptiert drei Parameter: element - das aktuell verarbeitete Element, index – der aktuelle Elementindex, array – das Array selbst, in dem der Filter aufgerufen wurde 🎜🎜thisArg: der dafür verwendete Wert beim Ausführen des Rückrufs.
Mithilfe von Filtern können wir die äußere Schleife auf Codeebene vereinfachen: 🎜🎜🎜🎜🎜🎜Code: 🎜🎜
function unique (arr) {
    const newMap = new Map()
    return arr.filter((a) => !newMap.has(a) && newMap.set(a, 1));}
Nach dem Login kopieren
Nach dem Login kopieren
🎜Kombinierte Sortierideen: 🎜rrreee🎜🎜 5. Schlüssel-Wert-Paare (Schlüssel-Wert)🎜 🎜 🎜Die oben genannten Methoden können grob zusammengefasst werden in 🎜
    🎜nicht sortiertes Array, zwei Durchlaufbeurteilungen (Durchquerung, Abfrage) 🎜🎜sortiertes Array, Vergleich benachbarter Elemente🎜
🎜Wir schlagen eine weitere Methode vor Verwendet die Object-Objekt-Schlüsselwertmethode, um die Anzahl der im Array erscheinenden Elemente zu zählen. Es gibt auch zwei vorläufige Beurteilungslogiken: Nehmen Sie [1,1,1,2,2,3,'3']Beispiel: 🎜<ol> <li>统计每个元素出现的次数,obj:{1: 3, 2: 2, 3: 3}, 返回这个<code>objkey而不管他们的value
  • 只元素首次出现,再次出现则证明他是重复元素
  • 5.1 统计次数
    var arr = [1, 2, 1, 1, '1', 3, 3];const unique = function(arr) {
        var obj = {};
        var res = [];
        arr.forEach(item => {
            if (!obj[item]) {
                obj[item] = true;
                res.push(item);
            }
        });
        return res;}console.log(unique(arr)); // [1, 2, 3]
    Nach dem Login kopieren
    Nach dem Login kopieren
    5.2 结合filter
    var arr = [1, 2, 1, 1, '1'];const unique = function(arr) {
        var obj = {};
        return arr.filter(function(item, index, arr){
            return obj.hasOwnProperty(item) ? false : (obj[item] = true)
        })}console.log(unique(arr)); // [1, 2]
    Nach dem Login kopieren
    Nach dem Login kopieren
    5.3 key: value存在的问题

    对象的属性是字符串类型的,即本身数字1字符串‘1’是不同的,但保存到对象中时会发生隐式类型转换,导致去重存在一定的隐患。

    考虑到string和number的区别(typeof 1 === ‘number’, typeof ‘1’ === ‘string’),

    所以我们可以使用 typeof item + item 拼成字符串作为 key 值来避免这个问题:

    var arr = [1, 2, 1, 1, '1', 3, 3, '2'];const unique = function(arr) {
        var obj = {};
        var res = [];
        arr.forEach(item => {
            if (!obj[typeof item + item]) {
                obj[typeof item + item] = true;
                res.push(item);
            }
        });
        return res;}console.log(unique(arr)); // [ 1, 2, '1', 3, '2' ]
    Nach dem Login kopieren
    Nach dem Login kopieren

    六、ES6

    随着 ES6 的到来,去重的方法又有了进展,比如我们可以使用 Set 和 Map 数据结构。

    6.1 Set

    Set:它允许你存储任何类型的唯一值,无论是原始值或者是对象引用

    代码:

    var arr = [1, 2, 1, '1', '2'];const unique = function(arr) {
       return Array.from(new Set(arr));}console.log(unique(arr)); // [ 1, 2, '1', '2' ]
    Nach dem Login kopieren
    Nach dem Login kopieren

    简化1:

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

    简化2:

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

    Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。

    • Map.prototype.has(key):返回一个布尔值,表示Map实例是否包含键对应的值。
    • Map.prototype.set(key, value):设置Map对象中键的值。返回该Map对象。
    function unique (arr) {
        const newMap = new Map()
        return arr.filter((a) => !newMap.has(a) && newMap.set(a, 1));}
    Nach dem Login kopieren
    Nach dem Login kopieren

    写到这里比较常规的数组去重方法就总结的差不多了,如果需要更强大的去重方法,我们需要对他们进行组合,而且因为场景的不同,我们所实现的方法并不一定能涵盖到

    相关免费学习推荐:javascript(视频)

    Das obige ist der detaillierte Inhalt vonJavaScript-Thema 2: Array-Deduplizierung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Verwandte Etiketten:
    Quelle:csdn.net
    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