摘要:數組去重的幾種方法遍歷數組法這是最簡單的數組去重方法,實現思路新建一新數組,傳入要去重的數組,遍歷該數組,若值不在新數組中則加入該數組需要注意點判斷值是否在數組的方法是方法,以下不支持,示例如下對象鍵值對法思路新建一對象以及數組,遍歷傳入
數組去重的幾種方法
1.遍歷數組法
這是最簡單的數組去重方法,實現思路:新建一新數組,傳入要去重的數組,遍歷該數組,若值不在新數組中則加入該數組;需要注意點:判斷值是否在數組的方法“indexOf”是ECMAScript5 方法,IE8以下不支持,示例如下:
function removeDup(arr) { let new_arr = []; arr.forEach((val) => { if(new_arr.indexOf(val) === -1){ new_arr.push(val); } }); return new_arr; }
2.對象鍵值對法
思路:新建一對象以及數組,遍歷傳入的數組,判斷值是否為js對象的鍵,若不是則新增鍵值,并放入數組中;需要注意的地方:判斷是否為js對象鍵時,會自動對傳入的鍵toString();
function removeDup2(arr) { let obj = {}, new_arr = [], val, type; for(let i = 0, len = arr.length; i < len; i+=1) { val = arr[i]; type = typeof val; if(!obj[val]) { obj[val] = [type]; new_arr.push(val); }else if(obj[val].indexOf(type) === -1) { obj[val].push(type); new_arr.push(val); } } return new_arr; }
缺點:無法真正區分兩個對象,如:`{a:1}`和`{a: 2}`,因為typeof結果都是`"object"`,可用`JSON.stringify()`來解決; es6優化后如下
function unique(array) { let obj = {}; let type; return array.filter((item, index, array) => { type = typeof item + JSON.stringify(item); return obj.hasOwnProperty(type) ? false : (obj[type] = item); } ) } // 可去除undefined, NaN, Object重復項
3.排序后相鄰去除法
思路:首先將要去重的數組使用sort方法排序后,相同的值就會排在一起,然后就可以只判斷當前元素與上一個元素是否相同,若不同則添加進去;
function unique(array) { let res = []; let sortedArray = array.slice(0).sort();//先排序 let seen;//記錄上一個元素 for(let i = 0, len = sortedArray.length; i < len; i++) { let current = sortedArray[i]; if(!i || seen !== current) { res.push(current); } seen = current; } return res; }
優化:可傳入一個isSorted參數,表明該數組是否已排序,如果為true,那么就判斷相鄰元素是否相同;如果為false,則使用indexOf判斷:
function unique(array, isSorted) { let res = []; let seen;//記錄上一個元素 for(let i = 0, len = array.length; i < len; i++) { let current = array[i]; if(isSorted) { if(!i || seen !== current) { res.push(current); } seen = current; }else if(res.indexOf(current) === -1) { res.push(current); } } return res; }
再優化:想象一個場景,你需要對數組的每一項進行一些處理,但又不想再遍歷一次,那么可添加第三個參數itreatee,接受一個函數作為處理函數;
function unique(array, isSorted, iteratee) { let res = []; let seen = []; for(let i = 0, len = array.length; i < len; i++) { let value = array[i]; let computed = iteratee ? iteratee(value, i, array) : value; if(isSorted) { if(!i || seen !== computed) { res.push(value); } seen = computed; }else if(iteratee) { if(seen.indexOf(computed) === -1) { res.push(value); seen.push(computed); } }else if(res.indexOf(value) === -1) { res.push(value); } } return res; }
4.ES6,Set和Map去重
function unique(array) { return Array.from(new Set(array)); } //擴展運算符簡化 let unique = (arr) => [...new Set(arr)]; //使用Map function unique(array) { let seen = new Map(); return arr.filter((a) => !seen.has(a) && seen.set(a, 1)); }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97961.html
摘要:專題系列第三篇,講解各種數組去重方法,并且跟著寫一個前言數組去重方法老生常談,既然是常談,我也來談談。它類似于數組,但是成員的值都是唯一的,沒有重復的值。 JavaScript 專題系列第三篇,講解各種數組去重方法,并且跟著 underscore 寫一個 unique API 前言 數組去重方法老生常談,既然是常談,我也來談談。 雙層循環 也許我們首先想到的是使用 indexOf 來循...
摘要:數組去重,一般都是在面試的時候才會碰到,一般是要求手寫數組去重方法的代碼。如果是被提問到,數組去重的方法有哪些你能答出其中的種,面試官很有可能對你刮目相看。數組去重的方法一利用去重中最常用不考慮兼容性,這種去重的方法代碼最少。 數組去重,一般都是在面試的時候才會碰到,一般是要求手寫數組去重方法的代碼。如果是被提問到,數組去重的方法有哪些?你能答出其中的10種,面試官很有可能對你刮目相看...
摘要:而數組元素去重是基于運算符的。而如果有迭代函數,則計算傳入迭代函數后的值,對值去重,調用方法,而該方法的核心就是調用方法,和我們上面說的方法一異曲同工。 Why underscore (覺得這部分眼熟的可以直接跳到下一段了...) 最近開始看 underscore.js 源碼,并將 underscore.js 源碼解讀 放在了我的 2016 計劃中。 閱讀一些著名框架類庫的源碼,就好像...
摘要:數組去重雙層循環使用雙層嵌套循環是最原始的方法用來存儲結果如果是唯一的,那么執行完循環,等于外層循環內層循環當和相等時,跳出循環。否則說明元素唯一,這時成立,將此元素添加到中。它類似于數組,但是成員的值都是唯一的,沒有重復的值。 JavaScript數組去重 雙層循環 使用雙層嵌套循環是最原始的方法: var array = [a,b,a]; function unique(arra...
摘要:現在要求去重下面這個數組測試重復重復方法一測試重復重復去重后測試重復是新加的集合集合中的值不會重復。歡迎大家一起討論提出新的去重方法。有任何錯誤請在評論指出。 現在要求去重下面這個數組 [1, 2, 3, 3, 3, 0, 1, 2, 測試, 重復, 重復, NaN, NaN, false, false]; 方法一:ES6 Set() let arr = [1, 2, 3, 3, 3,...
閱讀 1074·2021-11-19 09:40
閱讀 2214·2021-11-15 18:00
閱讀 1267·2021-10-18 13:34
閱讀 2248·2021-09-02 15:40
閱讀 1533·2019-08-30 14:01
閱讀 1113·2019-08-30 11:11
閱讀 2482·2019-08-29 15:26
閱讀 722·2019-08-29 14:15