摘要:中的數(shù)組去重問(wèn)題,被討論都快爛掉了。,法,根據(jù)對(duì)象的屬性不存在相同的特點(diǎn),有點(diǎn)類(lèi)似方法。同理這四個(gè)值都會(huì)被認(rèn)為是一樣的而被去重。
js中的數(shù)組去重問(wèn)題,被討論都快爛掉了。網(wǎng)上也有很多方法,不過(guò)都大同小異,復(fù)制來(lái)復(fù)制去的。
當(dāng)然這里不是討論我是不是有什么新方法了,沒(méi)有,只是在實(shí)踐的時(shí)候發(fā)現(xiàn)一些問(wèn)題,值得拿出來(lái)說(shuō)說(shuō)!
去重的思路有幾種
1,第一個(gè)與后面所有的比較,發(fā)現(xiàn)重復(fù)的就刪除掉,再取第二個(gè)與后面的比較,以此類(lèi)推!
2,先排序,比較相鄰的。
3,創(chuàng)建臨時(shí)數(shù)組,原數(shù)組一個(gè)一個(gè)往里塞,若已存在就不塞了。
4,hash法,根據(jù)對(duì)象的屬性不存在相同的特點(diǎn),有點(diǎn)類(lèi)似方法3。
….
當(dāng)然這些具體代碼網(wǎng)上很多,不一一列舉!下面來(lái)探討的是其中被人們忽略的一些問(wèn)題。
方法1的代碼如下
function arrayUnique(arr){ for (var i=0;i?arr.length;i++){ for (var j=i+1;j?arr.length-1;j++){ if ( arr[j] === arr[i] ){ arr.splice(j,1); j--; } } } return arr; }
方法4的hash方法如下
function arrayUnique2(arr){ var hash = {}; var temp = []; for (var i=0;i?arr.length;i++){ if ( !hash[arr[i]] ){ hash[arr[i]] = true; temp.push(arr[i]); } } /* for (var prop in hash){ console.log(prop+"----"+typeof(prop)) } */ return temp; }
雖然hash方法擁有非常搞的效率,但是存在一些問(wèn)題,因?yàn)閖avascript中的數(shù)組是可以存儲(chǔ)任意數(shù)據(jù)類(lèi)型的值,就是可以是數(shù)字、字符串、或者數(shù)組、對(duì)象、函數(shù)等等。
實(shí)際測(cè)試中確實(shí)可以去除長(zhǎng)得一樣的數(shù)組或者對(duì)象,比如如下arr中的第四和第五個(gè)[1,2]會(huì)被去重,但問(wèn)題來(lái)了。
var aa = "aa",bb = "bb"; var arr = [ 1,"1","abc",[1,2],[1,2],["1","2"],"1,2",["aa","bb"],[aa,bb],document,"[object HTMLDocument]",function (){return 1},function (){return 1;} ] console.log(arrayUnique2(arr));//[1,"abc",[1,2],["aa","bb"],document,function (){return 1},function (){return 1;}]
如果兩個(gè)對(duì)象的引用不同即使長(zhǎng)得一樣也不是全等的,這個(gè)我們知道,也可以說(shuō)去掉長(zhǎng)得相同的兩個(gè)元素。
于是我將hash對(duì)象的屬性跟屬性的數(shù)據(jù)類(lèi)型在函數(shù)中輸出出來(lái),發(fā)現(xiàn)對(duì)象屬性或json鍵名的數(shù)據(jù)類(lèi)型都是字符串類(lèi)型的,并且每個(gè)被添加的屬性,會(huì)被先隱式調(diào)用toString方法,即DOM中的document對(duì)象,變成對(duì)象的屬性即json的鍵名的時(shí)候,隱式調(diào)用toString方法,這樣就和"[object HTMLDocument]’是一樣的了,數(shù)組去重的話,后面字符串類(lèi)型的[object HTMLDocument]會(huì)被去掉。
同理[1,2],[1,2],[‘1′,’2′],’1,2’這四個(gè)值都會(huì)被認(rèn)為是一樣的而被去重。
數(shù)組最后面的兩個(gè)函數(shù),因?yàn)樵诤竺娴暮瘮?shù)里加了個(gè)分號(hào),否則也是相同。
所以會(huì)有這樣的結(jié)論,在使用hash方法的時(shí)候,數(shù)組元素變成對(duì)象屬性名或者json鍵名的時(shí)候,數(shù)據(jù)會(huì)先隱式調(diào)用toString方法變成字符串,然后成為對(duì)象的屬性。而這樣的后果就是,只要兩個(gè)元素各自調(diào)用toString方法后的字符串相等,兩個(gè)值遍認(rèn)為是相同,即使兩個(gè)值根本不想等。
所以這種hash去重的方法有局限性,即在去除所有值的數(shù)據(jù)類(lèi)型相同的情況下,他是效率很高很好用,但是數(shù)據(jù)類(lèi)型不同的情況下。還是老老實(shí)實(shí)用其他方法比較吧。(當(dāng)然一般后端傳到前端的數(shù)據(jù),數(shù)據(jù)類(lèi)型一般都是相同的。)
以上就是我對(duì)去重中遇到問(wèn)題的一些思考,希望對(duì)大家有幫助,網(wǎng)上的東西,不能盲目拿來(lái)就用,要有自己的思考。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/82133.html
摘要:學(xué)習(xí)筆記工作中常用到的語(yǔ)法只是簡(jiǎn)單提及和,今天有空于是寫(xiě)了這篇文章深入理解中的和數(shù)據(jù)結(jié)構(gòu),與其它數(shù)據(jù)結(jié)構(gòu)的互相轉(zhuǎn)換。的提供了新的數(shù)據(jù)結(jié)構(gòu)。本身是一個(gè)構(gòu)造函數(shù),用來(lái)生成數(shù)據(jù)結(jié)構(gòu)。 文中的內(nèi)容主要是來(lái)自于阮一峰的《ES6標(biāo)準(zhǔn)入門(mén)》(第三版)。《學(xué)習(xí)ES6筆記──工作中常用到的ES6語(yǔ)法》只是簡(jiǎn)單提及Set和Map,今天有空于是寫(xiě)了這篇文章──《深入理解:ES6中的Set和Map數(shù)據(jù)結(jié)構(gòu),M...
摘要:本文是重溫基礎(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....
摘要:類(lèi)似于數(shù)組,但是中不存在重復(fù)元素。可以接受一個(gè)數(shù)組或者其他具有接口的數(shù)據(jù)結(jié)構(gòu)作為參數(shù)從上面的代碼可以看出有去重的功能。去重還有另一個(gè)方法將數(shù)據(jù)結(jié)構(gòu)的數(shù)據(jù)轉(zhuǎn)換成數(shù)組。清除實(shí)例的指定成員。返回一個(gè)布爾值,表示某個(gè)值是否在實(shí)例之中。 Set Set類(lèi)似于數(shù)組,但是Set中不存在重復(fù)元素。Set可以接受一個(gè)數(shù)組(或者其他具有itarable接口的數(shù)據(jù)結(jié)構(gòu))作為參數(shù) const set = ne...
摘要:數(shù)據(jù)類(lèi)型基本用法提供了一種類(lèi)似于數(shù)組的新的數(shù)據(jù)結(jié)構(gòu)。實(shí)例屬性和方法本身是一個(gè)構(gòu)造函數(shù),用來(lái)生成數(shù)據(jù)結(jié)構(gòu)。返回一個(gè)布爾值,表示該值是否為的成員。任何具有接口且每個(gè)成員都是一個(gè)雙元素的數(shù)組的數(shù)據(jù)結(jié)構(gòu)都可以當(dāng)作構(gòu)造函數(shù)的參數(shù)。 Set數(shù)據(jù)類(lèi)型 基本用法 ES6 提供了一種類(lèi)似于數(shù)組的新的數(shù)據(jù)結(jié)構(gòu) Set。它的成員的值都是唯一的,沒(méi)有重復(fù)的值。 const s = new Set(); [2...
摘要:上一篇數(shù)據(jù)結(jié)構(gòu)與算法鏈表寫(xiě)在前面說(shuō)明數(shù)據(jù)結(jié)構(gòu)與算法系列文章的代碼和示例均可在此找到一集合集合數(shù)據(jù)結(jié)構(gòu)集合是一種包含不同元素的數(shù)據(jù)結(jié)構(gòu)。集合中的元素成為成員。 上一篇:JS數(shù)據(jù)結(jié)構(gòu)與算法_鏈表 寫(xiě)在前面 說(shuō)明:JS數(shù)據(jù)結(jié)構(gòu)與算法 系列文章的代碼和示例均可在此找到 一、集合Set 1.1 集合數(shù)據(jù)結(jié)構(gòu) 集合set是一種包含不同元素的數(shù)據(jù)結(jié)構(gòu)。集合中的元素成為成員。集合的兩個(gè)最重要特性是:...
閱讀 982·2023-04-26 01:47
閱讀 1672·2021-11-18 13:19
閱讀 2042·2019-08-30 15:44
閱讀 645·2019-08-30 15:44
閱讀 2291·2019-08-30 15:44
閱讀 1232·2019-08-30 14:06
閱讀 1420·2019-08-30 12:59
閱讀 1900·2019-08-29 12:49