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