簡(jiǎn)介
去重是一個(gè)比較常見的算法嘁扼,簡(jiǎn)而言之就是把一個(gè)集合中重復(fù)的項(xiàng)目去掉只保留不重復(fù)的。下面是一個(gè)JS最簡(jiǎn)單的處理。后續(xù)2-4沒給答案原理差不多匆赃,大家試一下吧。
基本算法
遍歷目標(biāo)數(shù)組今缚,把目標(biāo)數(shù)組中的元素放入新的數(shù)組中算柳,放入前檢查是否已經(jīng)存在,如果已經(jīng)存在則不再放入姓言。
基礎(chǔ)函數(shù)
- 數(shù)組去重
例如:[1,4,6,7,9,6,4,5]
去重后的結(jié)果為:[1,4,6,7,9,5]
代碼:
function uniqueArray(arr){
// 存放結(jié)果
var res = [];
for(var i in arr){// 遍歷數(shù)組元素
if(res.indexOf(arr[i]) == -1){// 如果結(jié)果數(shù)組不存在該元素則保存
res.push(arr[i]);
}
}
// 返回去重后的數(shù)組
return res;
}
// 測(cè)試
uniqueArray([1,4,6,7,9,6,4,5]);
注意:
indexOf
是ES5新增加函數(shù)瞬项,用來獲取數(shù)組中元素的位置(下標(biāo)),兼容性IE8+
- 字符串去重
例如:"14679645"
去重后的結(jié)果為:"146795"
代碼:
function uniqueString(str){
// 存放結(jié)果
var res = "";
for(var i in str){// 遍歷字符串元素
if(res.indexOf(str.charAt(i)) == -1){// 如果結(jié)果不存在該元素則保存
res+=str.charAt(i);
}
}
// 返回去重后的字符串
return res;
}
// 測(cè)試
uniqueString("14679645");
發(fā)現(xiàn)沒有何荚,與數(shù)字去重長(zhǎng)的差不多囱淋。
可以把字符串轉(zhuǎn)化成數(shù)組,然后去重餐塘,再把結(jié)果數(shù)組轉(zhuǎn)換成字符串妥衣。(這里使用了上面那個(gè)數(shù)組去重的函數(shù)uniqueArray
)
// 字符串轉(zhuǎn)換成數(shù)組
function uniqueString(str){
// 把字符串轉(zhuǎn)換成數(shù)組
var arr = str.slice("");
// 數(shù)組去重
var res = uniqueArray(arr);
// 把數(shù)組轉(zhuǎn)換成字符串
return res.join("");
}
uniqueString("14679645");
- 數(shù)字去重
例如:14679645
去重后的結(jié)果為:146795
延續(xù)上面的思路就比較簡(jiǎn)單了,先把數(shù)字轉(zhuǎn)換成字符串戒傻,再做處理税手。
代碼:
function uniqueNumber(num){
// 把數(shù)字轉(zhuǎn)換成字符串
var str = num + "";
// 字符串去重
var res = uniqueString(str);
// 把字符串轉(zhuǎn)換成數(shù)字
return parseInt(res);
}
// 測(cè)試
uniqueNumber(14679645);
- 對(duì)象數(shù)組去重
例如:
[
{
name:"張三",
age:18
},
{
name:"李四",
age:17
},
{
name:"張三",
age:18
},
{
name:"王五",
age:18
}
]
去重后的結(jié)果為:
[
{
name:"張三",
age:18
},
{
name:"李四",
age:17
},
{
name:"王五",
age:18
}
]
代碼:略