中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Javascript怎么實現數組去重

發布時間:2021-04-12 16:38:27 來源:億速云 閱讀:166 作者:Leah 欄目:web開發

使用Javascript怎么實現數組去重?很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

第一種用instenceof方法

instanceof是ES5提供的一個方法,它可以用來判斷實例是否是某個類的實例,例如:

[] instenceof Array
//返回結果是true

這種方法的不好之處就是兼容性不好,對于一些低版本瀏覽器不支持ES5的就要懵逼了。

第二種方法是通過原型鏈的方式來判斷

了解js的話都應該懂得js這個語言的特點就是原型鏈式的,所有的對象都繼承自Object.prototype,而prototype上又有toString()方法,這個toString()方法是干什么用的呢?就是以字符串的形式返回當前對象的值。第一次看可能這句話可能不大明白,舉個例吧:

var num = 123;
num.toString(); //返回結果為"123"

有沒有看明白一點?就是返回num這個對象值的字符串形式,也就是”123”。好了,這跟判斷數組有什么關系?想一下所有的對象都繼承自Object.prototype,數組也是啊,如果把一個數組送到Object.prototype里作為一個“值”,在調用toString()方法,那它應該顯示出這個對象的名字才對啊,這就是判斷的原理,代碼如下:

Object.prototype.toString.call([]); //結果是"[object Array]"

像jQuery這樣的腳本庫的isArray()用的就是這個方法。

數組拍平

說完判直奔主題,先是數組拍平,什么是數組拍平呢?就是把[1,[2,[3,4],5]]鋪成[1,2,3,4,5]。關于數組拍平我有兩種思路,第二種比較奇葩,留點懸念吧哈哈。

第一種是常規思路

對數組進行遍歷,如果數組里面套著數組就繼續遍歷里面的,直到把每個元素都遍歷完,然后一邊遍歷一邊塞入新的數組變量里,這樣就完成拍平了,具體代碼如下:

panelArr = function(arr){
 var newArr = [];
 var isArray = function(obj) {
  return Object.prototype.toString.call(obj) === '[object Array]';
 };
 var dealArr = function(arr){
  for (var i = 0;i<arr.length;i++){
   isArray(arr[i]) ? dealArr(arr[i]) : newArr.push(arr[i]);
  }
 };
 dealArr(arr);
 return newArr;
};
console.log(panelArr([1,[2,3]])); //[1,2,3]

當然這個方法也可以寫在Array.prototype里,使用起來更方便。這個方法有個問題就是內存占用上,因為采用遞歸如果數據量大了會占用大量大量內存。

第二種奇葩思路

第二種思路就是不把數組來看,也不遍歷了直接拍平。聽起來略奇怪,怎么能不遍歷就拍平?就是使用join()方法,將數組轉換成字符串,然后正則去掉符號最后合并,這個方法在使用注意不能join("") ,因為如果這樣分割的話,13是1和3還是13?不好區分,代碼如下:

var arr = [1,2,[33,43],20,19];
arr.join(".").replace(/,/g,".").split("."); //["1", "2", "33", "43", "20", "19"]

注意:這個方法會轉換數據類型成字符串。

數組去重

下面是數組去重,舉例來說就是[1,2,3,3,4,5,5,5,6]變成[1,2,3,4,5,6]。這個實現的核心就是去重這里,如果能夠快速判斷元素是否重復就是關鍵。

還是兩種思路

第一種遍歷的思路

就是準備一個新的數組變量,塞入前每次對這個變量進行遍歷看看是否有重復的,如果沒有就塞入,最后生成的新數組就是去重后的數組了。示例代碼如下:

function uniqueArr(arr){
 var newArr = [];
 newArr.push(arr[0]);
 for(var i = 1; i<arr.length;i++){
 var repeat = false;
 for(var j = 0;j<newArr.length;j++){
 if(arr[i] == newArr[j]){
 repeat = true;
 }
 }
 if(!repeat){
 newArr.push(arr[i]);
 }
 }
 return newArr;
}

第二種使用哈希判斷

上面那個時間復雜度為O(n^2)的方法并不是什么好方法,它的瓶頸就是判斷是否重復這里,所以我們換成一個更高效的檢索是否重復的方法,這個方法就是哈希,為什么哈希檢索最快?翻翻數據結構吧,這里就不在贅述了。

這個方法的思路就是在原始數組和去重數組之間加入一個哈希過濾,總的來看就是原數組數據交給哈希,看是否有重復,若是沒有則添加進去。具體代碼如下:

function uniqueArr(arr){
 var newArr = [],
 hashFilter = {};
 for(var i = 0;i<arr.length;i++){
 if(!hashFilter[arr[i]]){
 //若不存在將此屬性對應的值改為true,并塞入去重數組中
 hashFilter[arr[i]] = true;
 newArr.push(arr[i]);
 }
 }
 return newArr;
}

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

高邮市| 舒城县| 玉树县| 和硕县| 乌拉特中旗| 台山市| 洛隆县| 囊谦县| 黑山县| 台南县| 遵义市| 加查县| 巩义市| 舒城县| 牙克石市| 韩城市| 隆化县| 台北市| 阿克苏市| 会泽县| 滁州市| 大足县| 文安县| 当阳市| 九龙县| 满城县| 都昌县| 常宁市| 湟源县| 吴堡县| 嘉黎县| 密云县| 安西县| 丘北县| 禹城市| 临沭县| 长岭县| 龙江县| 廊坊市| 丰都县| 康平县|