在我們面試的過程中,數組去重,應該算翻牌率極高的題了,結合網上和自己的嘗試,寫了這個測試,整體涉及的知識點極廣且曲徑通幽。
總結起來,有 101 種方法,999 朵玫瑰 1001 夜,哈哈,我自己都不信,要不我先寫 11 種,接下的 90 種各種看官潑墨揮毫自由發揮!其實,倒也遠不止11種方法,只是在下才疏學淺,只能拋磚引玉,暖暖場子。
你如果還有更棒的想法,歡迎留言開腦洞,畢竟,你美,說什麼都對!
在閱讀本文前,建議先去看我寫的《十種方法解決--- 1-100累加和》,其實數組去重跟這個思路很相似!
var arr =['大唐',1,3,2,5,9,"1",5,4,7,0,10,6,8,"大唐","盛世","6",null,undefined,false,true,"false"];
1、indexOf
利用 數組如果不存在該項,indexOf = -1
function demo1(ary){
var i = 0,
res = [];
for (; i < ary.length; i++) {
res.indexOf(ary[i]) === -1 && res.push(ary[i]);
}
console.log(res.sort((a,b)=>a-b));
}
demo1(arr);
結果:["大唐", 0, false, "false", null, "盛世", "1", true, 1, 2, 3, 4, 5, 6, "6", 7, 8, 9, 10, undefined]
2、數組索引
數組每一項只有唯一的索引值。
這個方法有個缺點,就是結果會把所有值,轉換成字符串類型
function demo2(ary){
var i,j,
cur = [],
res = [];
for (i in ary) {
cur[ary[i]] = 0
}
for (j in cur) {
res.push(j)
}
console.log(res.sort((a,b)=>a-b));
}
demo2(arr);
結果:["0", "1", "10", "2", "3", "4", "5", "6", "7", "8", "9", "false", "null", "true", "undefined", "大唐", "盛世"]
3、對象屬性
對象內屬性名只能存在唯一的一個,同樣屬性名,後面會覆蓋前面的屬性值
如:var obj = {a:1,b:2,a:3}; console.log(obj.a); //結果:3
缺點同例2,會轉換成字符串類型
function demo3(ary){
var i,j,
cur = {},
res = [];
for (i in ary) {
cur[arr[i]] = 0
}
for(j in cur){
res.push(j)
}
console.log(res.sort((a,b)=>a-b));
}
demo3(arr);
結果:["0", "1", "10", "2", "3", "4", "5", "6", "7", "8", "9", "false", "null", "true", "undefined", "大唐", "盛世"]
4、for 循環
利用兩個 for 遍歷出的值,進行對比,刪除重複項
這一句很關鍵:len = ary.length; 因爲 數組的長度在不斷變化中。
arr = arr.sort(); //可省略
function demo4(ary){
var j,
i = 0,
res = ary,
len = res.length;
for (; i < len; i++) {
for ( j = i + 1; j < len; j++) {
res[i] === res[j] && res.splice(j,1);
}
}
console.log(res.sort((a,b)=>a-b));
}
demo4(arr);
結果:[0, "1", 1, 10, 2, 3, 4, 5, "6", 6, 7, 8, 9, false, "false", null, true, "大唐", "盛世", undefined]
5、reduce
通過排序,然後 當前項 對比 上一項,如果不同則添加到數組
function demo5(ary){
var res = [];
res = ary.sort().reduce((init, current)=>{
if(init.length === 0 || init[init.length-1] !== current) {
init.push(current);
}
return init;
},[]);
console.log(res);
}
demo5(arr);
結果:[0, "1", 1, 10, 2, 3, 4, 5, "6", 6, 7, 8, 9, false, "false", null, true, "大唐", "盛世", undefined]