摘要:使用進行操作,如下但是得到的其實是一個非常規的數組了,也就是說其實主要是用于對對象屬性的操作。這確實要根據自己的需求來了。當然簡單的實現如下好了到了這兒,我們開始總結下常用的數組去重的方法。
前言
我們先來看下面的例子,當然來源與網絡,地址《刪除數組中多個不連續的數組元素的正確姿勢》
我們現在將數組中所有的‘a’元素刪除:
var arr = ["a", "a", "b", "c", "d", "a", "a", "e", "g", "a", "f"]; arr.forEach(function(value, index) { value === "a" ? arr.splice(index, 1) : ""; }) console.log(arr); //["a", "b", "c", "d", "a", "e", "g", "f"]
只要相鄰的‘ a’ 元素, 都沒被刪除,splice不但可以刪除元素本身, 還同時可以減少數組長度( 就是抹去一切痕跡),
這樣導致后續的數組元素會代替已經刪除的元素的位置, 但是循環是按照數組的下標按順序刪除, 這樣就會漏掉遷移的元素。
使用delete進行操作,如下:
var arr = ["a", "a", "b", "c", "d", "a", "a", "e", "g", "a", "f"]; arr.forEach(function(value, index) { value === "a" ? delete arr[index] : ""; }) console.log(arr); //[2: "b", 3: "c", 4: "d", 7: "e", 8: "g", 10: "f"]
但是得到的arr其實是一個非常規的數組了,也就是說其實delete主要是用于對對象屬性的操作。這確實要根據自己的需求來了。
當然簡單的實現如下:
var arr = ["a", "a", "b", "c", "d", "a", "a", "e", "g", "a", "f"]; var newArr = arr.filter(function(key) { return key !== "a" }) console.log(newArr); //["b", "c", "d", "e", "g", "f"]
好了到了這兒,我們開始總結下常用的數組去重的方法。
方法一:雙層循環,外層循環元素,內層循環時比較值
如果有相同的值則跳過,不相同則push進數組
Array.prototype.distinct = function(){ var arr = this, result = [], i, j, len = arr.length; for(i = 0; i < len; i++){ for(j = i + 1; j < len; j++){ if(arr[i] === arr[j]){ j = ++i; } } result.push(arr[i]); } return result; } var arra = [1,2,3,4,4,1,1,2,1,1,1]; arra.distinct(); //返回[3,4,2,1]方法二:利用splice直接在原數組進行操作
雙層循環,外層循環元素,內層循環時比較值
值相同時,則刪去這個值
注意點:刪除元素之后,需要將數組的長度也減1.
Array.prototype.distinct = function (){ var arr = this, i, j, len = arr.length; for(i = 0; i < len; i++){ for(j = i + 1; j < len; j++){ if(arr[i] == arr[j]){ arr.splice(j,1); len--; j--; } } } return arr; }; var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,]; var b = a.distinct(); console.log(b.toString()); //1,2,3,4,5,6,56
優點:簡單易懂
缺點:占用內存高,速度慢
Array.prototype.distinct = function (){ var arr = this, i, obj = {}, result = [], len = arr.length; for(i = 0; i< arr.length; i++){ if(!obj[arr[i]]){ //如果能查找到,證明數組元素重復了 obj[arr[i]] = 1; result.push(arr[i]); } } return result; }; var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,]; var b = a.distinct(); console.log(b.toString()); //1,2,3,4,5,6,56方法四:數組遞歸去重
運用遞歸的思想
先排序,然后從最后開始比較,遇到相同,則刪除
Array.prototype.distinct = function (){ var arr = this, len = arr.length; arr.sort(function(a,b){ //對數組進行排序才能方便比較 return a - b; }) function loop(index){ if(index >= 1){ if(arr[index] === arr[index-1]){ arr.splice(index,1); } loop(index - 1); //遞歸loop函數進行去重 } } loop(len-1); return arr; }; var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,56,45,56]; var b = a.distinct(); console.log(b.toString()); //1,2,3,4,5,6,45,56方法五:利用indexOf以及forEach
首先如果你的瀏覽器是低版本不支持indexOf與forEach方法,那么可以先先對瀏覽器Array對象進行支持indexOf和forEach的polyfill
Array.prototype.indexOf = Array.prototype.indexOf || function(item) { for (var i = 0, j = this.length; i < j; i++) { if (this[i] === item) { return i; } } return -1; } Array.prototype.forEach = Array.prototype.forEach || function(callback, thisArg) { if (!callback || typeof callback !== "function") return; for (var i = 0, j = this.length; i < j; i++) { callback.call(thisArg, this[i], i, this); } }
去重方法:
Array.prototype.distinct = function (){ var arr = this, result = [], len = arr.length; arr.forEach(function(v, i ,arr){ //這里利用map,filter方法也可以實現 var bool = arr.indexOf(v,i+1); //從傳入參數的下一個索引值開始尋找是否存在重復 if(bool === -1){ result.push(v); } }) return result; }; var a = [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,2,3,3,2,2,1,23,1,23,2,3,2,3,2,3]; var b = a.distinct(); console.log(b.toString()); //1,23,2,3方法六:數組下標判斷法, 遍歷數組,利用indexOf判斷元素的值是否與當前索引相等,如相等則加入
Array.prototype.distinct = function (){ var arr = this, ret = []; arr.forEach(function(e, i, array) { if (array.indexOf(e) === i) { ret.push(e); } }); return ret; }; var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,]; var b = a.distinct(); console.log(b.toString()); //1,2,3,4,5,6,56方法七:利用ES6的set
Set數據結構,它類似于數組,其成員的值都是唯一的。
利用Array.from將Set結構轉換成數組
function dedupe(array){ return Array.from(new Set(array)); } dedupe([1,1,2,3]) //[1,2,3]
拓展運算符(...)內部使用for...of循環
let arr = [1,2,3,3]; let resultarr = [...new Set(arr)]; console.log(resultarr); //[1,2,3]
當然以上方法可以不用寫到Array的原型上,多帶帶寫一個方法,傳遞數組當參數也是可以的。
參考地址:http://www.cnblogs.com/leonwang/p/4845576.html
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/90311.html
摘要:忍者級別的函數操作對于什么是匿名函數,這里就不做過多介紹了。我們需要知道的是,對于而言,匿名函數是一個很重要且具有邏輯性的特性。通常,匿名函數的使用情況是創建一個供以后使用的函數。 JS 中的遞歸 遞歸, 遞歸基礎, 斐波那契數列, 使用遞歸方式深拷貝, 自定義事件添加 這一次,徹底弄懂 JavaScript 執行機制 本文的目的就是要保證你徹底弄懂javascript的執行機制,如果...
摘要:目的把數組中重復的內容去掉。思路每次取出數組一項和其他的所有項比較如果比較有相同的把重復的這個后面的刪掉。是位置,表示長度。改進思路三鍵名是數據類型的前三位組成的字符串。思路四使用的方法可以去除數組內重復的表明展開數組的每一項 目的:把數組中重復的內容去掉。eg:將數組[2, 3, 1, 4, 2, 2, 3, 4, 1, 5,1]變成[2, 3, 1, 4, 5, 1]。 思路1: ...
摘要:目的把數組中重復的內容去掉。思路每次取出數組一項和其他的所有項比較如果比較有相同的把重復的這個后面的刪掉。是位置,表示長度。改進思路三鍵名是數據類型的前三位組成的字符串。思路四使用的方法可以去除數組內重復的表明展開數組的每一項 目的:把數組中重復的內容去掉。eg:將數組[2, 3, 1, 4, 2, 2, 3, 4, 1, 5,1]變成[2, 3, 1, 4, 5, 1]。 思路1: ...
摘要:目的把數組中重復的內容去掉。思路每次取出數組一項和其他的所有項比較如果比較有相同的把重復的這個后面的刪掉。是位置,表示長度。改進思路三鍵名是數據類型的前三位組成的字符串。思路四使用的方法可以去除數組內重復的表明展開數組的每一項 目的:把數組中重復的內容去掉。eg:將數組[2, 3, 1, 4, 2, 2, 3, 4, 1, 5,1]變成[2, 3, 1, 4, 5, 1]。 思路1: ...
摘要:本文是重溫基礎系列文章的第十一篇。返回一個布爾值,表示該值是否為的成員。使用回調函數遍歷每個成員。與數組相同,對每個成員執行操作,且無返回值。 本文是 重溫基礎 系列文章的第十一篇。 今日感受:注意身體,生病花錢又難受。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1.語法和數據類型 【重溫基礎】2.流程控制和錯誤處理 【重溫基礎】3....
閱讀 661·2021-10-09 09:41
閱讀 641·2019-08-30 15:53
閱讀 1071·2019-08-30 15:53
閱讀 1207·2019-08-30 11:01
閱讀 1562·2019-08-29 17:31
閱讀 983·2019-08-29 14:05
閱讀 1712·2019-08-29 12:49
閱讀 409·2019-08-28 18:17