javascript
JS中排除重复元素
使用JAVA中,常常使用Map/Set等集合的containsKey/contains方法以判斷是否存在重復(fù)元素。
而在JS的數(shù)組中并無(wú)提供排重方法,而直接在邏輯代碼中遍歷數(shù)組以排重,會(huì)增加代碼的復(fù)雜度。
所以,可以給數(shù)組添加一個(gè)排重的方法。
?
一、實(shí)現(xiàn)方式
1、嵌套循環(huán)查找重復(fù)元素
在用例開(kāi)發(fā)過(guò)程中匆忙間寫(xiě)了一個(gè),用傳統(tǒng)的嵌套循環(huán)查找是否存在重復(fù)元素。
/*** 數(shù)組是否重復(fù),如重復(fù)則返回重復(fù)元素* @return {}*/ Array.prototype.isDouble = function() {for (var i = 0; i < this.length; i++) {for (j = i + 1; j < this.length; j++) {if (this[i] && this[j] && this[i] == this[j]) {return this[i];}}} }?
2、類(lèi)似HASH算法思路實(shí)現(xiàn)
在網(wǎng)上看到一個(gè)更好的寫(xiě)法,類(lèi)似哈希的寫(xiě)法。
/*** 數(shù)組是否重復(fù),如重復(fù)則返回重復(fù)元素 * @return {}*/ Array.prototype.isDouble = function() {var hashObject = {};for (var i = 0; i < this.length; i++) {if (hashObject[this[i]]) {return this[i];} else {hashObject[this[i]] = true;}} }?
二、效率
1、簡(jiǎn)單測(cè)試
在IE和Chrome下都做了簡(jiǎn)單測(cè)試,第二種方法比第一種方法快不少。
?
三、附注
1、哈希算法
⑴?字符串 -> 系列整數(shù) (該整數(shù)為hash值,hash值不能逆轉(zhuǎn)為字符串)。
⑵?f(hash值)通過(guò)結(jié)果值映射到有限的范圍內(nèi)。常用的hash函數(shù)為取mod。(除留余數(shù)法)
⑶?hash函數(shù)映射過(guò)程中,往往有可能出現(xiàn)沖突,如兩個(gè)不同的hash值通過(guò)f(n)映射到相同的地址,這時(shí),通常可以為Array的每個(gè)元素掛一個(gè)鏈表存放沖突的元素。(鏈地址法)
?
引用嚴(yán)蔚敏的《數(shù)據(jù)結(jié)構(gòu)》中的一句話(huà):
……記錄的存儲(chǔ)位置和它的關(guān)鍵字之間建立一個(gè)確定的對(duì)應(yīng)關(guān)系f,使每個(gè)關(guān)鍵字和結(jié)構(gòu)中一個(gè)唯一的存儲(chǔ)位置相對(duì)應(yīng)……。我們稱(chēng)這個(gè)對(duì)應(yīng)關(guān)系f為哈希函數(shù),按這個(gè)思想建立的表為哈希表
總結(jié)
- 上一篇: 运维自动化之使用PHP+MYSQL+SH
- 下一篇: 图像处理之深度学习