国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

js--數(shù)組hash法去重引發(fā)的json鍵名的思考

sarva / 695人閱讀

摘要:中的數(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

相關(guān)文章

  • 深入理解:ES6中Set和Map數(shù)據(jù)結(jié)構(gòu),Map與其它數(shù)據(jù)結(jié)構(gòu)互相轉(zhuǎn)換

    摘要:學(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...

    Cristalven 評(píng)論0 收藏0
  • 【重溫基礎(chǔ)】11.Map和Set對(duì)象

    摘要:本文是重溫基礎(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....

    meteor199 評(píng)論0 收藏0
  • ES6學(xué)習(xí)之 -- Set數(shù)據(jù)結(jié)構(gòu)

    摘要:類(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...

    wawor4827 評(píng)論0 收藏0
  • ES6新增Set、Map數(shù)據(jù)結(jié)構(gòu)

    摘要:數(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...

    lentoo 評(píng)論0 收藏0
  • JS數(shù)據(jù)結(jié)構(gòu)與算法_集合&字典

    摘要:上一篇數(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è)最重要特性是:...

    sf_wangchong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<