输入
var arr=[1,2,3,2,3,1,6,4,5,1];
输出
var arr=[1,2,3,6,4,5];
方法一(map/for/forEach + indexOf)
遍历输入,条件是输出数组中没有的数,放到输出数组中。
function unique(arr){
var res=[];
arr.map(item=>{
if(res.indexOf(item)===-1){
res.push(item);
}
});
return res;
};
var arr=[1,2,3,2,3,1,6,4,5,1];
unique(arr);//[1,2,3,6,4,5]
方法二(includes)
includes 检测数组是否有某个值, 和indexOf思路基本一样
function unique(arr){
if(!Array.isArray(arr)){return false}
var res=[];
arr.forEach(item=>{
if(!res.includes(item)){
res.push(item);
}
})
return res;
};
var arr=[1,2,3,2,3,1,6,4,5,1];
unique(arr); // [1, 2, 3, 6, 4, 5]
方法三(...或者Array.from配合new Set)
利用Set的特性。先将数组转为Set,完成去重,然后在转为数组
Set: 如果传递一个可迭代对象,它的所有元素将不重复地被添加到新的 Set中。如果不指定此参数或其值为null,则新的 Set为空
function unique(arr){
return Array.from(new Set(arr));
};
function unique(arr){
return [...new Set(arr)];
};
var arr=[1,2,3,2,3,1,6,4,5,1];
unique(arr); // [1, 2, 3, 6, 4, 5]
方法四
方法五
方法六(reduce + includes)
function unique(arr){
return arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]);
};
var arr=[1,2,3,2,3,1,6,4,5,1];
unique(arr); // [1, 2, 3, 6, 4, 5]
总结
- includes 的实现应该是基于indexOf。
- 返回数组中没有就添加,最直观的做法。