從“繁”到“簡”進行數組去重

来源:http://www.cnblogs.com/shapeY/archive/2017/10/09/7639658.html
-Advertisement-
Play Games

數組去重的方式有很多,讓我們從最原始的方式一步步進化到一行代碼搞定 ...


前言

  隨著JavaScript提供語法的增多,數組去重方式也越來越多。現在從最原始的方式到最簡潔的方式,一步步進行剖析。

雙重迴圈

  數組去重,不就是比較數組元素,去掉重覆出現的麽。最原始的方式不正是雙重迴圈進行比較處理嘛

    //測試數據
    var test = [1,2,2,10,'1','a','a','b','@','@'];

    console.log(unique1(test));  //[1,2,10,'1','a','b','@']

    function unique1(target) {   //雙層迴圈比較數組元素進行去重
      var res = [];      //存放數據
      for(var i = 0 ; i<target.length ; i++){

        for(var j = 0,resLen = res.length ; j < resLen ; j++){
          if(target[i] === res[j]){  //如果有相同的數據,則break
            break;
          }
        }

        if(j === resLen){   //res中沒有相同的數據,則存放
          res.push(target[i])
        }
      }
      return res;
    }

  創建res數組存放返回結果;外層迴圈遍歷target中的每一個數組元素,內層迴圈將target中的數組元素與res數組中的每一個值進行對比,如果都不相同,則存放到res中。迴圈完成,返回去重後的數組。這種原始的方式具有良好的相容性

indexof優化內層迴圈

  在本慄中使用indexof優化內層迴圈。indexOf()方法返回在數組中可以找到一個給定元素的第一個索引,如果不存在,則返回-1

    var unique4_1 = (target) => [...new Set(target)];

    console.log(unique2(test));  //[1,2,10,'1','a','b','@']

    function unique2(target) {   //indexof簡化內層迴圈
      var res = [];      //存放數據
      for(var i = 0 ; i<target.length ; i++){
        if(res.indexOf(target[i]) < 0)  //如果res中不存在該元素,返回-1
        res.push(target[i])
      }
      return res;
    }

  使用了indexof方法,就不在需要內層迴圈,當然還有其他的方式可以優化內層迴圈了

對象鍵值對優化內層迴圈

  對象的鍵不同重覆,這個特性可以用來判斷重覆元素

    //測試數據
    var test = [1,2,2,10,'1','a','a','b','@','@'];

    console.log(unique3(test));  //[1,2,10,'a','b','@']   因為對象鍵是字元串 所以此種方式會認為 1 和 '1' 是相同的

    function unique3(target) {  //對象鍵值的方式
      var obj = {};
      var res = target.filter(function(value,index){
        return obj.hasOwnProperty(value) ? false : (obj[value] = true);
      })
      return res;
    }

  註意:由於對象的鍵都是字元,所以,無法區分 1 和  '1' ,所以需要再進行修改一下,存放時加上類型判斷。不瞭解類型判斷的可參考上篇博文: http://www.cnblogs.com/shapeY/p/7600460.html

 

    function unique4(target) {  //對象鍵值的方式
      var obj = {};
      var res = target.filter(function(value,index){
        return obj.hasOwnProperty(typeof value + value ) ? false : (obj[typeof value + value] = true);
      })
      return res;
    }

   加上了類型判斷, 1 對應為 Number1 , '1' 對應為 String1,即可正常區分開。

filter優化外層迴圈

  在本慄中使用filter優化外層迴圈。filter() 方法創建一個新數組, 其包含通過所提供函數實現的測試的所有元素。

    var test = [1,2,2,10,'1','a','a','b','@','@'];

    console.log(unique5(test));  //[1,2,10,'1','a','b','@']

    function unique5(target) {   //filter簡化外層迴圈
      var res = target.filter(function(value,index,array){
        return target.indexOf(value) === index    //第一次出現則返回true
      })
      return res
    }

  在target上直接進行過濾,如果是該元素第一次出現,則返回true,否則返回false;這樣filter新創建的數組中每個元素只會出現一次,達到了去重的目的。至此我們不再使用for迴圈,代碼量也減少了很多。

Set去重

  ES6 提供了新的數據結構 Set。它類似於數組,但是成員的值都是唯一的,沒有重覆的值。這種特性用來數組去重,十分的方便。

    var test = [1,2,2,10,'1','a','a','b','@','@'];

    console.log(unique6(test));  //[1,2,10,'1','a','b','@']

    function unique6(target) {  //ES6 —— set
      return [...new Set(target)]
    }

  '...' 是ES6中的擴展運算符,此處的作用是將Set展開為用逗號隔開的參數序列 , 非常簡單的就實現了數組去重。不熟悉 ES6語法的童鞋們,先自行瞭解。如果再用上箭頭函數,真的是一句話就搞定了,如下:

    //測試數據
    var test = [1,2,2,10,'1','a','a','b','@','@'];

    var unique6_1 = (target) => [...new Set(target)];  //乾脆利落

    console.log(unique6_1(test));  //[1,2,10,'1','a','b','@']

 結語

  至此,從雙重迴圈的十幾行代碼到最後 set+箭頭函數的一行搞定。從‘繁’到‘簡’都已經實現了數組的去重,代碼量減少的背後是對JavaScript方法的應用。其實核心思路沒變,實現的手段變了而已。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第四課的標題及第五課的標題 HN標記 六個不同的 HTML 標題:所有瀏覽器都支持 - 標簽。定義和用法 - 標簽可定義標題。 定義最大的標題。 定義最小的標題。 由於 h 元素擁有確切的語義,因此請您慎重地選擇恰當的標簽層級來構建文檔的結構。因此,請不要利用標題標簽來改變同一行中的字體大小。 相反... ...
  • 1 <html> 2 <head> 3 <title>這是第一節課網頁標題</title> 4 <meta charset="UTF-8"> 5 <meta name="keywords" content="專業,學習,腳本"> 6 </head> 7 <body link="red" vlink= ...
  • 1 2 3 這是第一節課網頁標題 4 5 6 7 你好啊 8 9 10 本章設計的知識: 11 1、個簡單的 HTML 文檔,帶有最基本的必需的元素: 12 13 14 15 文檔的標題 16 17 18 19 文檔的內容... ... 20 21 22 23 所有瀏... ...
  • 案例:嫦娥——尋開心出品:凱迪仕 1、內容:這是一支視頻類H5案例。Loading完畢進入頁面,首屏提示案例最佳觀看方式為先鎖屏再橫屏。點擊開始按鈕播放視頻,視頻講述“葫蘆娃”纏著爺爺講故事,爺爺給他們講了一個嫦娥的故事:嫦娥面對鎮長的兒子天蓬、帥氣的吳剛以及才華橫溢的後裔的追求不知如何選擇,於是決 ...
  • 原因 問題應該是當用戶滑動或切換時,無法判斷是哪個tabs應該進行滑動切換和展示切換動畫。 解決 swipeEnabled 是否允許在標簽之間進行滑動 animationEnabled 是否在更改標簽時動畫 在 根tabs 導航設置里進行設置: 設置後應該就能正常切換了。 ...
  • 一、現象 全屏頁面中的圖表,在很多的時候需要 resize 一把,以適應頁面的大小變化 二、解決 1、引入 : import { Observable } from 'rxjs'; 2、使用(在ngOnInit方法中): ...
  • 下圖是前端工程師圖解: 7e7ec141gdf7d4810f25f&690 前端開發的核心是HTML + CSS + JavaScript。本質上它們構成一個MVC框架,即HTML作為信息模型(Model),CSS控制樣式(View),JavaScript負責調度數據和實現某種展現邏輯(Contro ...
  • 寫在前面 最近在做移動端方面運用到了餓了麽的 前端組件庫,因為不想單純用組件而使用它,故想深入瞭解一下實現原理。後續將會繼續研究一下其他的組件實現原理,有興趣的可以關註下。 代碼在這裡: "戳我" 1. 說明 父容器 ,子頁面 2. 核心解析 2.1 頁面初始化 由於所有頁面都在手機屏幕左側一個屏幕 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...