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

普通數(shù)組去重

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

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

對象數(shù)組去重

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

<body>

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

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

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

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

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

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

推薦閱讀更多精彩內(nèi)容

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