第一種
思路:比較新數(shù)組中是否有原數(shù)組中的重復(fù)項(xiàng)黎茎,如果有重復(fù)的就不添加到新數(shù)組
- 循環(huán)數(shù)組添怔,遍歷數(shù)組的每一個(gè)元素
- 對(duì)于新數(shù)組進(jìn)行內(nèi)部循環(huán)俯萎,如果發(fā)現(xiàn)數(shù)組中已經(jīng)存在了arr[i]凉袱,結(jié)束循環(huán)芥吟,如果新數(shù)組循環(huán)完成后侦铜,就可以添加
function unique(arr){
var newarr = [];
for(var i = 0; i<arr.length; i++){
// 遍歷新數(shù)組专甩,判定是否元素已經(jīng)存在
for(var j=0;j<newarr.length; j++){
if(arr[i]===newarr[j]){
break;
}
}
// 對(duì)于循環(huán)完成的元素進(jìn)行push
if(j == newarr.length){
newarr.push(arr[i])
}
}
return newarr
}
第二種(不考慮兼容)
思路:如果一個(gè)元素的indexOf()不等于本身的索引就是重復(fù)的
function unique(arr){
var newarr = [];
arr.forEach((item,idx,array)=>{
array.indexOf(item)===idx && newarr.push(item);
})
return newarr
}
// 反過(guò)來(lái)就是說(shuō)我們過(guò)濾掉indexOf() 不等于本身的索引的元素
function unique(arr){
var newarr = arr.filter((item,idx,array)=>{
return array.indexOf(item)===idx;
})
return newarr
}
第三種(只針對(duì)數(shù)組都是數(shù)字)
思路:利用數(shù)組的sort()方法,相同的元素會(huì)被放到相鄰的位置钉稍,然后比較前后位置就可以了涤躲。
function unique(arr){
var newarr = arr.concat().sort().filter((item,idx,array)=>{
// !idx是針對(duì)第一個(gè)元素,沒(méi)有比較直接返回
return !idx || item != array[idx-1];
})
}
var a = [1, 1, 3, 2, 1, 2, 4];
unique(a); //[1, 2, 3, 4]
var a = [1, '1', 3, 2, 1, 2, 4];
unique(a); //[1, 2, 3, 4]
這里就有問(wèn)題了贡未,由于我們用的是不完成等于!=
,所以這種情況只是針對(duì)于數(shù)字之間的比較种樱,如果輸入字符串,可能會(huì)被過(guò)濾掉俊卤。
拓展:為什么我這里不用嚴(yán)格的不等于呢嫩挤?!==
,這樣的話就不能排除特殊情況下的數(shù)字,這里根據(jù)需求來(lái)寫(xiě)
// 如果是
return !idx || item !== array[idx-1];
var a = [1, '1',1, 3, 2, 2, 4];
unique(a); //[1,'1',1, 2, 3, 4]
第四種 (ES6的set構(gòu)造函數(shù))
思路:通過(guò)es6的set的值唯一性消恍,把數(shù)組去掉重復(fù)的岂昭,然后用Array.from()把迭代的對(duì)象變成數(shù)組
function unique(arr){
return Array.from(new set(arr));
}
第五種(重復(fù)的元素會(huì)出現(xiàn)在數(shù)組的結(jié)尾,改變了數(shù)組的格局)
思路:利用for循環(huán)中狠怨,++i可以進(jìn)入下一個(gè)循環(huán)约啊,跳過(guò)已經(jīng)重復(fù)的元素
function unique(a) {
var res = [];
for (var i = 0, len = a.length; i < len; i++) {
for (var j = i + 1; j < len; j++) {
// 這一步十分巧妙
// 如果發(fā)現(xiàn)相同元素
// 則 i 自增進(jìn)入下一個(gè)循環(huán)比較
if (a[i] === a[j])
j = ++i;
}
res.push(a[i]);
}
return res;
}
var a = [1, 1, '1', '2', 1];
var ans = unique(a);
console.log(ans); // => ["1", "2", 1]
第六種(有序的返回?cái)?shù)組)
function unique(arr) {
var res = [];
arr.forEach(item => {
if(!res.includes(item)) {
res.push(item)
}
})
return res
}
var a = [1, 1, '1', '2', 1];
var ans = unique(a);
console.log(ans); // => [1,"1", "2", ]