普通數組去重
一、普通數組去重
方法一:遍歷數組法
function func1(array){
var temp = [];//臨時數組
//遍歷當前數組
for(var i=0;i<array.length;i++){
//判斷array[i]是否在臨時數組中,不在則將array[i]的值復制到temp里
//indexOf()方法可返回某個指定的字符串或數組值在字符串或數組中首次出現的位置,若不在其中則返回-1
if (temp.indexOf(array[i]) === -1)
temp.push(array[i]);
}
return temp;
}
方法二:排序法
function func2(array){
var temp = [];//臨時數組
array.sort();//先給當前數組排序
temp.push(array[0]);
//因為數組已經經過排序,所以重復元素一定相鄰,判斷當前數組第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 = [];//臨時數組
var json = {};//創建一個空對象
//將當前數組的元素值當作對象的屬性,遍歷數組,比對對象,如果對象的這個屬性不存在則將當前數組元素復制到臨時數組,并添加該屬性且將屬性值賦值為1
for(var i = 0; i<array.length; i++){
if(!json[array[i]]){//如果對象沒有該屬性
temp.push(array[i]);
json[array[i]] = 1;//添加屬性,將屬性值賦值為1
}
}
return temp;
}
對象數組去重
方法一:將對象數組中name屬性相同的項去重
function func4(objArray) {
var result = [];//去重后返回的結果數組
var temp = {};//臨時對象
//將對象數組中每一項的name值作為屬性,若temp不擁有此屬性時則為temp添加此屬性且將其值賦為true,并將這一項push到結果數組中
for(var i=0;i<objArray.length;i++){
var myname = objArray[i].name;
if(temp[myname]){//如果temp中已經存在此屬性名,則說明遇到重復項
continue;//不繼續執行接下來的代碼,跳轉至循環開頭
}
temp[myname] = true;//為temp添加此屬性(myname)且將其值賦為true
result.push(objArray[i]);//將這一項復制到結果數組result中去
}
return result;
}
方法二:使用reduce方法將對象數組中name屬性相同的項去重
function func5(objArray){
var hash = {};
//reduce方法有兩個參數,第一個參數是一個callback,用于針對數組項的操作;第二個參數則是傳入的初始值,這個初始值用于單個數組項的操作。
objArray = objArray.reduce(function(item, next) {//這是針對數組項操作的函數,對于每個數組項,reduce方法都會將其調用一次
//可使用最多四個參數來聲明回調函數(第一個參數:通過上一次調用回調函數獲得的值;第二個參數:當前數組元素的值;第三個參數:當前數組元素的數字索引;第四個參數:包含該元素的數組對象)
//這里只使用了兩個參數,所以item和next分別代表上一次調用回調函數后的值和objArray項值
hash[next.name]?'':hash[next.name]=true&&item.push(next);//與func3邏輯相似
return item;
}, []);//初始值是一個空對象,使用reduce方法返回的是空對象通過疊加執行之后的結果
return objArray;
}
<!doctype html>
<title></title>
<body>
</body>
<script type="text/javascript">
(function(){
array = [1,2,3,3,3];//測試數組
objArray = [{age:1,name:'a'},{age:2,name:'a'},{age:3,name:'c'}];//測試對象數組
console.log(func1(array));//遍歷數組法
console.log(func2(array));//排序法
console.log(func3(array));//對象法
console.log(func4(objArray));//將對象數組中name屬性相同的項去重
console.log(func5(objArray));//使用數組內置的reduce方法將對象數組中name屬性相同的項去重
})()
//遍歷數組法
function func1(array){
var temp = [];//臨時數組
//遍歷當前數組
for(var i=0;i<array.length;i++){
//判斷array[i]是否在臨時數組中,不在則將array[i]的值復制到temp里
//indexOf()方法可返回某個指定的字符串或數組值在字符串或數組中首次出現的位置,若不在其中則返回-1
if (temp.indexOf(array[i]) === -1)
temp.push(array[i]);
}
return temp;
}
//排序法
function func2(array){
var temp = [];//臨時數組
array.sort();//先給當前數組排序
temp.push(array[0]);
//因為數組已經經過排序,所以重復元素一定相鄰,判斷當前數組第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 = [];//臨時數組
var json = {};//創建一個空對象
//將當前數組的元素值當作對象的屬性,遍歷數組,比對對象,如果對象的這個屬性不存在則將當前數組元素復制到臨時數組,并添加該屬性且將屬性值賦值為1
for(var i = 0; i<array.length; i++){
if(!json[array[i]]){//如果對象沒有該屬性
temp.push(array[i]);
json[array[i]] = 1;//添加屬性,將屬性值賦值為1
}
}
return temp;
}
//將對象數組中name屬性相同的項去重
function func4(objArray) {
var result = [];//去重后返回的結果數組
var temp = {};//臨時對象
//將對象數組中每一項的name值作為屬性,若temp不擁有此屬性時則為temp添加此屬性且將其值賦為true,并將這一項push到結果數組中
for(var i=0;i<objArray.length;i++){
var myname = objArray[i].name;
if(temp[myname]){//如果temp中已經存在此屬性名,則說明遇到重復項
continue;//不繼續執行接下來的代碼,跳轉至循環開頭
}
temp[myname] = true;//為temp添加此屬性(myname)且將其值賦為true
result.push(objArray[i]);//將這一項復制到結果數組result中去
}
return result;
}
//使用reduce方法將對象數組中name屬性相同的項去重
function func5(objArray){
var hash = {};
//reduce方法有兩個參數,第一個參數是一個callback,用于針對數組項的操作;第二個參數則是傳入的初始值,這個初始值用于單個數組項的操作。
objArray = objArray.reduce(function(item, next) {//這是針對數組項操作的函數,對于每個數組項,reduce方法都會將其調用一次
//可使用最多四個參數來聲明回調函數(第一個參數:通過上一次調用回調函數獲得的值;第二個參數:當前數組元素的值;第三個參數:當前數組元素的數字索引;第四個參數:包含該元素的數組對象)
//這里只使用了兩個參數,所以item和next分別代表上一次調用回調函數后的值和objArray項值
hash[next.name]?'':hash[next.name]=true&&item.push(next);//與func3邏輯相似
return item;
}, []);//初始值是一個空對象,使用reduce方法返回的是空對象通過疊加執行之后的結果
return objArray;
}
</script>
</html>