普通數(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;
}
<!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ù)。