距離上次發文,已經有一段時間了,最近工作比較忙,這不眼看快雙十一了,就相當于給大家一些福利吧!一、什么是數組去重
簡單說就是把數組中重復的項刪除掉,你 GET 到了嗎 ?下面我將簡單介紹下幾種基本的方法及其優缺點。
二、方法匯總兩層循環
無相同值直接 push 進新數組,有相同的值則直接跳過本次內部循環
/* * @param {Array} arr -要去重的數組 * @param {Array} result -初始化結果數組 */ const unique = (arr, result = []) => { const len = arr.length; for (let i = 0; i < len; i++) { for (let j = i + 1; j < len; j++) { if (arr[i] === arr[j]) { // 相等則直接跳過 j = ++i; } } result.push(arr[i]); } return result; }
相同的做標記,與新數組作比較,沒有則插入
/* * @param {Array} arr -要去重的數組 * @param {Array} result -初始化結果數組 */ const unique = (arr, result = []) => { result.push(arr[0]); const len = arr.length; let rLen = result.length; for (let i = 1; i < len; i++) { let flag = false; for (var j = 0; j < rLen; j++) { if (arr[i] === result[j]) { flag = true; break; } } if (!flag) { rLen++; result.push(arr[i]); } } return result; }
原地算法(在數組本身操作)
const unique = arr => { const len = arr.length; for (let i = 0; i < len; i++) { for (let j = i + 1; j < len; j++) { if (arr[i] == arr[j]) { arr.splice(j,1); len--; j--; } } } return arr; };
看似代碼代碼簡單,實則內存占用高,不實用
單層循環
對象鍵不能重復
const unique = (arr, result = []) => { const obj = {}; const len = arr.length; for (let i = 0; i< len; i++) { if (!obj[arr[i]]) { // 鍵沒有,則添加 obj[arr[i]] = 1; result.push(arr[i]); } } return result; };
這種方法無法判斷 "1" 和 1 等類型,解決方案:
添加判斷數據類型,比如 typeof ,obj[typeof arr[i] + arr[i]] 不過這還是判斷不了 ["1"] 和 [1],因為這被相加后,結果都一樣
添加 JSON.stringify() 對結果進行去格式化,這時就可以判斷了
排序后比較前后兩位,不相等則添加進新數組
const unique = (arr, result = []) => { arr.sort(); result.push(arr[0]); const len = arr.length; let rLen = result.length; for (let i = 1; i < len; i++) { if (arr[i] !== result[rLen - 1]) { result.push(arr[i]); rLen++; } } return result; }
方法比較直接
原地算法(排序后比較前后兩位,相等則刪除)
const unique = (arr) => { arr.sort(); let len = arr.length; for (let i = 1; i < len; i++) { if (arr[i] === arr[i - 1]) { arr.splice(i, 1) len--; } } return arr; }
不消耗額外的空間
偷懶的節奏
indexOf 判斷數組元素第一次出現的位置是否相同
const unique = (arr, result) => { arr.forEach((item, index, array) => { if(array.indexOf(item) === index) { result.push(item); } }); return result; } // 使用ES6 filter const unique = (arr) => arr.filter((item, index) => array.indexOf(item) === index);
使用ES6 方法更簡潔性能更好
indexOf 的ES6 方法通過 includes 判斷新數組中是否有該元素
const unique = (arr, result) => { arr.forEach((item, index, array) => { if(!result.includes(item)) { // 或者 result.indexOf(item) === -1 result.push(item); } }); return result; }
建議使用 includes
Map 數據結構,不懂 Map 的自行解決,傳送門
const unique = arr => { const map = new Map(); return arr.filter((item) => !map.has(item) && map.set(item, 1)); }
對象關系映射可以設置不同類型的鍵,使之很快能收集 arr 中不一樣的數據
Set 數據結構,不允許出現重復數據,而且 Set 支持解構 傳送門
const unique = arr => Array.from(new Set(arr)); // 或者通過 ES6 的 ...解構 const unique = arr => [...new Set(arr)];
簡單粗暴
reduce,給定初始值,根據數組循環給出最終值
const unique = (arr, result = []) => arr.reduce((prev,curr) => prev.includes(curr) ? prev : [...prev, curr], result);三、總結
方法已經說了差不多了,就看你怎么用了,其中有一些差不多的方法,只是給了說明,沒給具體的例子,希望大家自己去試一下,告辭!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/98017.html
一、什么是數組扁平化 扁平化,顧名思義就是減少復雜性裝飾,使其事物本身更簡潔、簡單,突出主題。 數組扁平化,對著上面意思套也知道了,就是將一個復雜的嵌套多層的數組,一層一層的轉化為層級較少或者只有一層的數組。 Ps: flatten 可以使數組扁平化,效果就會如下: const arr = [1, [2, [3, 4]]]; console.log(flatten(arr)); // [1, ...
每日肥學 導讀?算法題一點點思路源碼和解析 ?面試題特別介紹 導讀 小伙伴們新的學期又要開始了,您是否已經做好了沖刺的準備了呢?如果您想在這個學期收獲的比別人更多我建議給肥肥點個關注。我們一起來增長知識,無論你是考研還是找工作或者是要加薪。這里都是一個不錯的選擇。讓我們紅塵作伴,一起肥學!!! ?算法題 實現獲取 下一個排列 的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列...
摘要:如果有兩個參數,該方法返回起始和結束位置之間的項,但不包括結束位置的項。刪除刪除任意數量的項,只需指定兩個參數要刪除的第一項的位置和要刪除的項數。例如會刪除數組中的前兩項。和這兩個方法都接收兩個參數要查找的項和可選的表示查找起點位置的索引。 下面總結了一些JavaScript中常用的數組操作方法。驗證是不是數組用 arr instanceof Array 或者Array.isArray...
閱讀 1958·2021-11-22 15:33
閱讀 3001·2021-11-18 10:02
閱讀 2603·2021-11-08 13:16
閱讀 1617·2021-10-09 09:57
閱讀 1366·2021-09-30 09:47
閱讀 2001·2019-08-29 13:05
閱讀 3064·2019-08-29 12:46
閱讀 1004·2019-08-29 12:19