摘要:中的數(shù)組去重問題,被討論都快爛掉了。,法,根據(jù)對象的屬性不存在相同的特點,有點類似方法。同理這四個值都會被認為是一樣的而被去重。
js中的數(shù)組去重問題,被討論都快爛掉了。網(wǎng)上也有很多方法,不過都大同小異,復制來復制去的。
當然這里不是討論我是不是有什么新方法了,沒有,只是在實踐的時候發(fā)現(xiàn)一些問題,值得拿出來說說!
去重的思路有幾種
1,第一個與后面所有的比較,發(fā)現(xiàn)重復的就刪除掉,再取第二個與后面的比較,以此類推!
2,先排序,比較相鄰的。
3,創(chuàng)建臨時數(shù)組,原數(shù)組一個一個往里塞,若已存在就不塞了。
4,hash法,根據(jù)對象的屬性不存在相同的特點,有點類似方法3。
….
當然這些具體代碼網(wǎng)上很多,不一一列舉!下面來探討的是其中被人們忽略的一些問題。
方法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方法擁有非常搞的效率,但是存在一些問題,因為javascript中的數(shù)組是可以存儲任意數(shù)據(jù)類型的值,就是可以是數(shù)字、字符串、或者數(shù)組、對象、函數(shù)等等。
實際測試中確實可以去除長得一樣的數(shù)組或者對象,比如如下arr中的第四和第五個[1,2]會被去重,但問題來了。
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;}]
如果兩個對象的引用不同即使長得一樣也不是全等的,這個我們知道,也可以說去掉長得相同的兩個元素。
于是我將hash對象的屬性跟屬性的數(shù)據(jù)類型在函數(shù)中輸出出來,發(fā)現(xiàn)對象屬性或json鍵名的數(shù)據(jù)類型都是字符串類型的,并且每個被添加的屬性,會被先隱式調(diào)用toString方法,即DOM中的document對象,變成對象的屬性即json的鍵名的時候,隱式調(diào)用toString方法,這樣就和"[object HTMLDocument]’是一樣的了,數(shù)組去重的話,后面字符串類型的[object HTMLDocument]會被去掉。
同理[1,2],[1,2],[‘1′,’2′],’1,2’這四個值都會被認為是一樣的而被去重。
數(shù)組最后面的兩個函數(shù),因為在后面的函數(shù)里加了個分號,否則也是相同。
所以會有這樣的結論,在使用hash方法的時候,數(shù)組元素變成對象屬性名或者json鍵名的時候,數(shù)據(jù)會先隱式調(diào)用toString方法變成字符串,然后成為對象的屬性。而這樣的后果就是,只要兩個元素各自調(diào)用toString方法后的字符串相等,兩個值遍認為是相同,即使兩個值根本不想等。
所以這種hash去重的方法有局限性,即在去除所有值的數(shù)據(jù)類型相同的情況下,他是效率很高很好用,但是數(shù)據(jù)類型不同的情況下。還是老老實實用其他方法比較吧。(當然一般后端傳到前端的數(shù)據(jù),數(shù)據(jù)類型一般都是相同的。)
以上就是我對去重中遇到問題的一些思考,希望對大家有幫助,網(wǎng)上的東西,不能盲目拿來就用,要有自己的思考。
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/82133.html
摘要:學習筆記工作中常用到的語法只是簡單提及和,今天有空于是寫了這篇文章深入理解中的和數(shù)據(jù)結構,與其它數(shù)據(jù)結構的互相轉(zhuǎn)換。的提供了新的數(shù)據(jù)結構。本身是一個構造函數(shù),用來生成數(shù)據(jù)結構。 文中的內(nèi)容主要是來自于阮一峰的《ES6標準入門》(第三版)?!秾W習ES6筆記──工作中常用到的ES6語法》只是簡單提及Set和Map,今天有空于是寫了這篇文章──《深入理解:ES6中的Set和Map數(shù)據(jù)結構,M...
摘要:本文是重溫基礎系列文章的第十一篇。返回一個布爾值,表示該值是否為的成員。使用回調(diào)函數(shù)遍歷每個成員。與數(shù)組相同,對每個成員執(zhí)行操作,且無返回值。 本文是 重溫基礎 系列文章的第十一篇。 今日感受:注意身體,生病花錢又難受。 系列目錄: 【復習資料】ES6/ES7/ES8/ES9資料整理(個人整理) 【重溫基礎】1.語法和數(shù)據(jù)類型 【重溫基礎】2.流程控制和錯誤處理 【重溫基礎】3....
摘要:類似于數(shù)組,但是中不存在重復元素??梢越邮芤粋€數(shù)組或者其他具有接口的數(shù)據(jù)結構作為參數(shù)從上面的代碼可以看出有去重的功能。去重還有另一個方法將數(shù)據(jù)結構的數(shù)據(jù)轉(zhuǎn)換成數(shù)組。清除實例的指定成員。返回一個布爾值,表示某個值是否在實例之中。 Set Set類似于數(shù)組,但是Set中不存在重復元素。Set可以接受一個數(shù)組(或者其他具有itarable接口的數(shù)據(jù)結構)作為參數(shù) const set = ne...
摘要:數(shù)據(jù)類型基本用法提供了一種類似于數(shù)組的新的數(shù)據(jù)結構。實例屬性和方法本身是一個構造函數(shù),用來生成數(shù)據(jù)結構。返回一個布爾值,表示該值是否為的成員。任何具有接口且每個成員都是一個雙元素的數(shù)組的數(shù)據(jù)結構都可以當作構造函數(shù)的參數(shù)。 Set數(shù)據(jù)類型 基本用法 ES6 提供了一種類似于數(shù)組的新的數(shù)據(jù)結構 Set。它的成員的值都是唯一的,沒有重復的值。 const s = new Set(); [2...
摘要:上一篇數(shù)據(jù)結構與算法鏈表寫在前面說明數(shù)據(jù)結構與算法系列文章的代碼和示例均可在此找到一集合集合數(shù)據(jù)結構集合是一種包含不同元素的數(shù)據(jù)結構。集合中的元素成為成員。 上一篇:JS數(shù)據(jù)結構與算法_鏈表 寫在前面 說明:JS數(shù)據(jù)結構與算法 系列文章的代碼和示例均可在此找到 一、集合Set 1.1 集合數(shù)據(jù)結構 集合set是一種包含不同元素的數(shù)據(jù)結構。集合中的元素成為成員。集合的兩個最重要特性是:...
閱讀 1112·2023-04-26 01:47
閱讀 1762·2021-11-18 13:19
閱讀 2114·2019-08-30 15:44
閱讀 712·2019-08-30 15:44
閱讀 2410·2019-08-30 15:44
閱讀 1293·2019-08-30 14:06
閱讀 1476·2019-08-30 12:59
閱讀 1951·2019-08-29 12:49