<font id="zqva1"></font>
<rt id="zqva1"></rt>
  • <tt id="zqva1"></tt>
    <cite id="zqva1"></cite>

    <cite id="zqva1"><noscript id="zqva1"></noscript></cite>
      <rp id="zqva1"><meter id="zqva1"></meter></rp>

        <cite id="zqva1"></cite>
          <b id="zqva1"></b>
          <rp id="zqva1"></rp>
          <cite id="zqva1"></cite>

          <rt id="zqva1"></rt>

        1. <rp id="zqva1"></rp>

          數組去重_原生js對普通數組去重算法的7種方法總結

          時間:?2017-12-22閱讀:?1070標簽:?Array

          第一種算法:

          算法思想:

          1、構建一個新數組,新數組包含一個元素,元素值為目標數組的一個值;

          2、從目標數組的第二個元素開始遍歷,依次取出每一個元素;

          3、將取出的元素與新數組里面的所有元素進行比較,如果沒有出現,則將該元素添加到新數組中,如果出現,則處理下一個目標數組的元素;

          4、目標數組的所有元素均已處理完。

          Array.prototype.deleteRepeat1=function (){
                  //構建一個新數組,存放結果,首先給newArray一個初值,初值為調用該函數的數組的第一個值即this[0]
                  var newArray=[this[0]];
                  //for循環,每次從原數組中取出一個元素
                  //用取出的元素循環與結果數組比較
                  for(var i=1;i<this.length;i++){
                      // 添加一個標記,用于標記當前元素是否在newArray中出現過
                      var repeat=false;
                      for(var j=0,len=newArray.length;j<len;j++){
                          //原數組取出的元素與結果數組元素相同
                          if(this[i] == newArray[j]){
                              repeat=true;
                              break;
                          }
                      }
                      //如果原數組中沒有該元素,則存放到結果數組中
                      if(!repeat){
                          newArray.push(this[i]);
                      }
                  }
                  return newArray;
              }
              var array=[1,1,2,2,2,3,3,4,5,6,6,6,6];
              array.deleteRepeat();//1,2,3,4,5,6

          對上面算法的改進:

          利用forEach,indexOf方法替代上述的循環和檢測:

          Array.prototype.deleteRepeat1=function (){
                  var newArray=[];
                  // index是目標數組中的每一個元素
                  this.forEach(function(index){
                      // indexOf方法返回index在newArray中出現的位置,如果沒有出現則返回-1
                      if(newArray.indexOf(index) == -1){
                          newArray.push(index);
                      }
                  });
                  return newArray;
              }

          但是在IE9+以下并不支持forEach函數;可以重寫forEach 函數實現兼容。


          第二種算法:

          算法思想:

          1、對目標數組進行排序;

          2、遍歷目標數組,檢測數組中的第 i 個元素與結果數組中最后一個元素是否相同,如果不同,則將該元素添加到結果數組中;

          Array.prototype.deleteRepeat2=function (){
                  // 首先對目標數組進行排序
                  this.sort();
                  var newArray=[];
                  // index是目標數組中的每一個元素
                  for(var i=0,len=this.length;i<len;i++){
                      // 將this[i]與newArray中的最后一個元素比較,因為已經排過序,相同的元素肯定在相同的位置了
                      if(this[i] !== newArray[newArray.length-1]){
                          newArray.push(this[i]);
                      }
                  }
                  return newArray;
              }

          這種算法的優缺點:

          去重后的數組是排過序的,而且無法區分與數字相同的數字字符 比如: “1” 和 1;


          第三種算法:

          算法思想:

          1、創建一個新數組和新對象;

          2、遍歷目標數組中的每一個元素,將該元素與對象進行比對,如果不重復則添加到結果數組中,同時將該元素的值作為對象的屬性,并將該屬性值設為1;

          Array.prototype.deleteRepeat2=function (){
                  var newArray =[];
                  // 創建一個空對象
                  var object = {};
                  // 每次取出一個元素,與對象進行比對,如果這個元素不重復,則添加到結果數組中,同時把這個元素的內存作為對象的一個屬性并存入對象中
                  for(var i=0,len=this.length;i<len;i++){
                      if(!object[typeof(this[i]) + this[i]]){
                          newArray.push(this[i]);
                          object[typeof(this[i]) + this[i]]=1;
                      }
                  }
                  return newArray;
              }

          這種算法的效果最好,速度最快。但是占用內存大。

          對這個算法的理解:

          這里的對象也可以換成一個數組,每次將不重復的元素作為數組的索引,然后將該索引值設為1,下次再出現時如果array[element]==1;說明此element已經出現過,是重復的。


          第四種算法:

          算法思想:

          1、創建一個新數組保存結果;

          2、對目標數組進行排序,將目標數組中的第一個元素存入結果數組中;

          3、處理目標數組的第二個元素,如果這個元素和它前面的元素不同,說明是不重復,則添加到結果數組中。

          Array.prototype.deleteRepeat3=function (){
                  var newArray =[this[0]];
                  this.sort();
                  for(var i=1;i<this.length;i++){
                      比較當前元素和前一個元素是否相同,如果重復,排序后,相同的會在一起。
                      if(this[i] !== this[i-1]){
                          newArray.push(this[i]);
                      }
                  }
                  return newArray;


          第五種算法:

          算法思想:

          1、利用數組的reduce方法,對數組中的每一個元素進行處理

          Array.prototype.deleteRepeat3=function (){
                  // 通過數組的reduce方法,對數組中的每一個元素進行處理,原理都一樣,只是使用了不同的方法
                  return this.reduce(function(newArray,index){
                      if(newArray.indexOf(index)<0){
                          newArray.push(index);
                      }
                      return newArray;
                  },[]);
              }


          第六種算法:

          算法思想:

          1、和上面相同,不過是使用了filter方法

          Array.prototype.deleteRepeat3=function (){
                  var newArray=[];
                  newArray=this.filter(function(ele,i,arr) {
                      return arr.indexOf(ele) === i;
                  });
                  return newArray;
              }


          第七種算法:

          這種是利用ES6去重,相對來說更為簡單

          //es6
              function deleteRepeat(arr){
                  const seen=new Map(){
                      return arr.filter((a)=>!seen.has(a)&&seen.set(a,1));
                  }
              }
              //or
              function deleteRepeat2(arr){
                  return Array.form(new Set(arr))
              }


          站長推薦

          1.阿里云: 本站目前使用的是阿里云主機,安全/可靠/穩定。點擊領取2000元代金券、了解最新阿里云產品的各種優惠活動點擊進入

          2.騰訊云: 提供云服務器、云數據庫、云存儲、視頻與CDN、域名等服務。騰訊云各類產品的最新活動,優惠券領取點擊進入

          3.廣告聯盟: 整理了目前主流的廣告聯盟平臺,如果你有流量,可以作為參考選擇適合你的平臺點擊進入

          鏈接: http://www.modern-decoration.com.cn/article/detial/273

          arguments轉化成Array數組的方法

          簡單說一下arguments,arguments 就是函數內一個內建對象,它包含函數接收到的所有變量;所以,在實際開發中,我們使用arguments可以很方便的獲取到所有的實參,并且也需要對其使用是寫數組的方法

          Array.prototype.slice.call()

          MDN中對于Array.prototype.slice.()的介紹中,提到了類數組對象。以下是原文:slice 方法可以用來將一個類數組(Array-like)對象/集合轉換成一個新數組。你只需將該方法綁定到這個對象上。 一個函數中的 arguments 就是一個類數組對象的例子。

          使用 Array.fill( ) 填充對象的問題

          當你想使用 Array.fill( ) 來填充一個全是空白對象的數組時需要特別注意。Array(length).fill({ }) 這樣填充創建的數組,里面每一項{ }都完全相同

          Array.from() 五個超好用的用途

          任何一種編程語言都具有超出基本用法的功能,它得益于成功的設計和試圖去解決廣泛問題。JavaScript 中有一個這樣的函數: Array.from:允許在 JavaScript 集合(如: 數組、類數組對象、或者是字符串

          es6之Array.from()方法

          Array.from()方法就是將一個類數組對象或者可遍歷對象轉換成一個真正的數組。==只要是部署了Iterator接口==的數據結構,Array.from都能將其轉為數組。

          Js Array對象常用方法

          不改變原數組:concat();join();slice();toString(),改變原數組:pop();push();reverse();shift();unshift();sort();splice(),array.concat(array)連接兩個或多個數組,返回被連接數組的一個副本

          Array.slice 8種不同用法

          在深入研究一些更高級的用法之前,讓我們看一下slice方法的基礎知識。如MDN文檔,slice 是數組上的一個方法,它最多有兩個參數,從該索引處開始提取原數組中的元素,如果該參數為負數,則表示從原數組中的倒數第幾個元素開始提取

          Array數組相關方法

          push向數組末尾添加元素;unshift向數組開頭增加元素;pop刪除數組末尾一項;shift刪除數組的第一項;join為數組添加指定的分隔符;slice找某一區域內的項,返回成新數組形式

          js數組的迭代

          js數組的迭代:forEach() 方法對數組的每個元素執行一次提供的函數。map() 方法創建一個新數組,其結果是該數組中的每個元素都調用一個提供的函數后返回的結果。filter() 方法創建一個新數組, 其包含通過所提供函數實現的測試的所有元素。

          es6之Array.of()和Array.from()

          es6新增了二種方法:Array.of()和Array.from(),它們有什么用途呢?在平時的開發中能給我們帶來什么方便呢?本篇將從一個創建數組的小問題開始,逐步揭開它們的面紗。

          內容以共享、參考、研究為目的,不存在任何商業目的。其版權屬原作者所有,如有侵權或違規,請與小編聯系!情況屬實本人將予以刪除!

          文章投稿關于web前端網站點搜索站長推薦網站地圖站長QQ:522607023

          小程序專欄: 土味情話心理測試腦筋急轉彎幽默笑話段子句子語錄成語大全運營推廣

          国产精品高清视频免费 - 视频 - 在线观看 - 影视资讯 - 唯爱网