js數(shù)組去重、對(duì)象數(shù)組去重

普通數(shù)組去重

一、普通數(shù)組去重

方法一:遍歷數(shù)組法
function func1(array){
    var temp = [];//臨時(shí)數(shù)組
    //遍歷當(dāng)前數(shù)組
    for(var i=0;i<array.length;i++){
        //判斷array[i]是否在臨時(shí)數(shù)組中,不在則將array[i]的值復(fù)制到temp里
        //indexOf()方法可返回某個(gè)指定的字符串或數(shù)組值在字符串或數(shù)組中首次出現(xiàn)的位置,若不在其中則返回-1
        if (temp.indexOf(array[i]) === -1)
            temp.push(array[i]); 
    }
    return temp;
}
方法二:排序法
function func2(array){
    var temp = [];//臨時(shí)數(shù)組
    array.sort();//先給當(dāng)前數(shù)組排序
    temp.push(array[0]);
    //因?yàn)閿?shù)組已經(jīng)經(jīng)過排序,所以重復(fù)元素一定相鄰,判斷當(dāng)前數(shù)組第i個(gè)元素與temp的最后一個(gè)元素是否相等,不相等時(shí)才復(fù)制元素
    for(var i=1;i<array.length;i++){
        if(array[i] != temp[temp.length-1])
            temp.push(array[i]);
    }
    return temp;
}
方法三:對(duì)象法
function func3(array){
    var temp = [];//臨時(shí)數(shù)組
    var json = {};//創(chuàng)建一個(gè)空對(duì)象
    //將當(dāng)前數(shù)組的元素值當(dāng)作對(duì)象的屬性,遍歷數(shù)組,比對(duì)對(duì)象,如果對(duì)象的這個(gè)屬性不存在則將當(dāng)前數(shù)組元素復(fù)制到臨時(shí)數(shù)組,并添加該屬性且將屬性值賦值為1
    for(var i = 0; i<array.length; i++){
        if(!json[array[i]]){//如果對(duì)象沒有該屬性
            temp.push(array[i]);
            json[array[i]] = 1;//添加屬性,將屬性值賦值為1
        }
    }
    return temp;
}

對(duì)象數(shù)組去重

方法一:將對(duì)象數(shù)組中name屬性相同的項(xiàng)去重
function func4(objArray) {
    var result = [];//去重后返回的結(jié)果數(shù)組
    var temp = {};//臨時(shí)對(duì)象
    //將對(duì)象數(shù)組中每一項(xiàng)的name值作為屬性,若temp不擁有此屬性時(shí)則為temp添加此屬性且將其值賦為true,并將這一項(xiàng)push到結(jié)果數(shù)組中
    for(var i=0;i<objArray.length;i++){  
        var myname = objArray[i].name;
        if(temp[myname]){//如果temp中已經(jīng)存在此屬性名,則說明遇到重復(fù)項(xiàng)
            continue;//不繼續(xù)執(zhí)行接下來的代碼,跳轉(zhuǎn)至循環(huán)開頭
        }  
        temp[myname] = true;//為temp添加此屬性(myname)且將其值賦為true
        result.push(objArray[i]);//將這一項(xiàng)復(fù)制到結(jié)果數(shù)組result中去
    }  
    return result;  
}
方法二:使用reduce方法將對(duì)象數(shù)組中name屬性相同的項(xiàng)去重
function func5(objArray){
    var hash = {}; 
    //reduce方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是一個(gè)callback,用于針對(duì)數(shù)組項(xiàng)的操作;第二個(gè)參數(shù)則是傳入的初始值,這個(gè)初始值用于單個(gè)數(shù)組項(xiàng)的操作。
    objArray = objArray.reduce(function(item, next) {//這是針對(duì)數(shù)組項(xiàng)操作的函數(shù),對(duì)于每個(gè)數(shù)組項(xiàng),reduce方法都會(huì)將其調(diào)用一次
        //可使用最多四個(gè)參數(shù)來聲明回調(diào)函數(shù)(第一個(gè)參數(shù):通過上一次調(diào)用回調(diào)函數(shù)獲得的值;第二個(gè)參數(shù):當(dāng)前數(shù)組元素的值;第三個(gè)參數(shù):當(dāng)前數(shù)組元素的數(shù)字索引;第四個(gè)參數(shù):包含該元素的數(shù)組對(duì)象)
        //這里只使用了兩個(gè)參數(shù),所以item和next分別代表上一次調(diào)用回調(diào)函數(shù)后的值和objArray項(xiàng)值
        hash[next.name]?'':hash[next.name]=true&&item.push(next);//與func3邏輯相似 
        return item;
    }, []);//初始值是一個(gè)空對(duì)象,使用reduce方法返回的是空對(duì)象通過疊加執(zhí)行之后的結(jié)果
    return objArray;
}
  • 代碼匯總與執(zhí)行
<!doctype html>
<title></title>

<body>

</body>
<script type="text/javascript">
(function(){
    array = [1,2,3,3,3];//測(cè)試數(shù)組
    objArray = [{age:1,name:'a'},{age:2,name:'a'},{age:3,name:'c'}];//測(cè)試對(duì)象數(shù)組
    console.log(func1(array));//遍歷數(shù)組法
    console.log(func2(array));//排序法
    console.log(func3(array));//對(duì)象法
    console.log(func4(objArray));//將對(duì)象數(shù)組中name屬性相同的項(xiàng)去重
    console.log(func5(objArray));//使用數(shù)組內(nèi)置的reduce方法將對(duì)象數(shù)組中name屬性相同的項(xiàng)去重
})()

//遍歷數(shù)組法
function func1(array){
    var temp = [];//臨時(shí)數(shù)組
    //遍歷當(dāng)前數(shù)組
    for(var i=0;i<array.length;i++){
        //判斷array[i]是否在臨時(shí)數(shù)組中,不在則將array[i]的值復(fù)制到temp里
        //indexOf()方法可返回某個(gè)指定的字符串或數(shù)組值在字符串或數(shù)組中首次出現(xiàn)的位置,若不在其中則返回-1
        if (temp.indexOf(array[i]) === -1)
            temp.push(array[i]); 
    }
    return temp;
}

//排序法
function func2(array){
    var temp = [];//臨時(shí)數(shù)組
    array.sort();//先給當(dāng)前數(shù)組排序
    temp.push(array[0]);
    //因?yàn)閿?shù)組已經(jīng)經(jīng)過排序,所以重復(fù)元素一定相鄰,判斷當(dāng)前數(shù)組第i個(gè)元素與temp的最后一個(gè)元素是否相等,不相等時(shí)才復(fù)制元素
    for(var i=1;i<array.length;i++){
        if(array[i] != temp[temp.length-1])
            temp.push(array[i]);
    }
    return temp;
}

//對(duì)象法
function func3(array){
    var temp = [];//臨時(shí)數(shù)組
    var json = {};//創(chuàng)建一個(gè)空對(duì)象
    //將當(dāng)前數(shù)組的元素值當(dāng)作對(duì)象的屬性,遍歷數(shù)組,比對(duì)對(duì)象,如果對(duì)象的這個(gè)屬性不存在則將當(dāng)前數(shù)組元素復(fù)制到臨時(shí)數(shù)組,并添加該屬性且將屬性值賦值為1
    for(var i = 0; i<array.length; i++){
        if(!json[array[i]]){//如果對(duì)象沒有該屬性
            temp.push(array[i]);
            json[array[i]] = 1;//添加屬性,將屬性值賦值為1
        }
    }
    return temp;
}

//將對(duì)象數(shù)組中name屬性相同的項(xiàng)去重
function func4(objArray) {
    var result = [];//去重后返回的結(jié)果數(shù)組
    var temp = {};//臨時(shí)對(duì)象
    //將對(duì)象數(shù)組中每一項(xiàng)的name值作為屬性,若temp不擁有此屬性時(shí)則為temp添加此屬性且將其值賦為true,并將這一項(xiàng)push到結(jié)果數(shù)組中
    for(var i=0;i<objArray.length;i++){  
        var myname = objArray[i].name;
        if(temp[myname]){//如果temp中已經(jīng)存在此屬性名,則說明遇到重復(fù)項(xiàng)
            continue;//不繼續(xù)執(zhí)行接下來的代碼,跳轉(zhuǎn)至循環(huán)開頭
        }  
        temp[myname] = true;//為temp添加此屬性(myname)且將其值賦為true
        result.push(objArray[i]);//將這一項(xiàng)復(fù)制到結(jié)果數(shù)組result中去
    }  
    return result;  
}

//使用reduce方法將對(duì)象數(shù)組中name屬性相同的項(xiàng)去重
function func5(objArray){
    var hash = {}; 
    //reduce方法有兩個(gè)參數(shù),第一個(gè)參數(shù)是一個(gè)callback,用于針對(duì)數(shù)組項(xiàng)的操作;第二個(gè)參數(shù)則是傳入的初始值,這個(gè)初始值用于單個(gè)數(shù)組項(xiàng)的操作。
    objArray = objArray.reduce(function(item, next) {//這是針對(duì)數(shù)組項(xiàng)操作的函數(shù),對(duì)于每個(gè)數(shù)組項(xiàng),reduce方法都會(huì)將其調(diào)用一次
        //可使用最多四個(gè)參數(shù)來聲明回調(diào)函數(shù)(第一個(gè)參數(shù):通過上一次調(diào)用回調(diào)函數(shù)獲得的值;第二個(gè)參數(shù):當(dāng)前數(shù)組元素的值;第三個(gè)參數(shù):當(dāng)前數(shù)組元素的數(shù)字索引;第四個(gè)參數(shù):包含該元素的數(shù)組對(duì)象)
        //這里只使用了兩個(gè)參數(shù),所以item和next分別代表上一次調(diào)用回調(diào)函數(shù)后的值和objArray項(xiàng)值
        hash[next.name]?'':hash[next.name]=true&&item.push(next);//與func3邏輯相似 
        return item;
    }, []);//初始值是一個(gè)空對(duì)象,使用reduce方法返回的是空對(duì)象通過疊加執(zhí)行之后的結(jié)果
    return objArray;
}
</script>
</html>
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第5章 引用類型(返回首頁) 本章內(nèi)容 使用對(duì)象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學(xué)一百閱讀 3,691評(píng)論 0 4
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 12,535評(píng)論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,697評(píng)論 19 139
  • 如是良人長(zhǎng)相絕,猶恐夢(mèng)中思上邪 “你是誰?” “不記得我的名字了嗎?” “我……” 安靜古老的小鎮(zhèn),有三葉對(duì)外面世...
    少年翔閱讀 370評(píng)論 0 2
  • 又是一個(gè)陰雨連綿的季節(jié),天空籠罩的烏云就像是為誰而去的定做,注定會(huì)有一個(gè)人離我們而去。 定格在眼前的一幕讓我想起了...
    煙燃了人禁了閱讀 263評(píng)論 0 1

友情鏈接更多精彩內(nèi)容