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