//数组去重
//方法一:使用indexOf
function test1(arr){
var tmp=[];
for(let i=0;i<arr.length;i++){
if(tmp.indexOf(arr[i])==-1){
tmp.push(arr[i])
}
}
return tmp;
}
//方法二:Set (ES6中最常用)
function test2(arr){
return Array.from(new Set(arr));
}
//方法三:对象键值法(速度快,占空间最多)
// 写一个空对象,把数组中的每一位当做对象的属性名,
// 利用对象的特性(同一属性名不可以出现两次)先把第一位当做属性名添加进去,
// 属性值随便写一个,再看第二位,如果第二位在对象中有属性名,就看下一位,
// 如果对象中没有属性名,就把这个值添加进去当属性名,只看对象的属性名,就去重了,
// 这个方法叫做hash
function test3(arr){
var res=[];
var obj={};
for(let i=0;i<arr.length;i++){
// console.log(!obj[arr[i]]);
if(!obj[arr[i]]){
obj[arr[i]]=true;
res.push(arr[i]);
}
}
return res;
}
var arr=[2,3,5,2,3,2];
// console.log(test3(arr));
//对象去重
var arr1=[
{ id: 1, name: 'a' },
{ id: 1, name: 'f' },
{ id: 2, name: 'b' },
{ id: 3, name: 'a' },
{ id: 3, name: 'g' },
{ id: 4, name: 'd' },
{ id: 5, name: 'e' },
]
console.log(obj5(arr1));
//1.双重for循环
function obj1(arr1){
for(let i=0;i<arr1.length-1;i++){
for(let j=i+1;j<arr1.length;j++){
if(arr1[i].id==arr1[j].id){
arr1.splice(j,1);
j--;
}
}
}
return arr1;
}
//2.借助对象的访问属性的方法
// obj中没有则添加 this.arr[i].id 这个key,并把值设为true,后续相同则不添加
function obj2(arr1){
var obj={};
var res=[]
for(let i=0;i<arr1.length;i++){
if(!obj[arr1[i].id]){
res.push(arr1[i]);
obj[arr1[i].id]=true;
}
}
return res;
}
//3.reduce方法
function obj3(arr1){
var obj={};
return arr1=arr1.reduce((item,next)=>{
obj[next.id] ? '':obj[next.id]=true&&item.push(next);
return item;
},[]);
}
//4.Map()
// has方法可以判断Map对象中是否存在指定元素,有则返回true,否则返回false
// set方法可以向Map对象添加新元素 map.set(key, value)
// values方法可以返回Map对象值的遍历器对象
function obj4(arr1){
let map=new Map();
for(let i of arr1){
if(!map.has(i.id)){
map.set(i.id,i)
}
}
arr1=[...map.values()]
return arr1;
}
//5.every()
// every() 方法用于检测数组所有元素是否都符合指定条件
// 所有元素都满足条件,则返回 true,有一个元素不满足,则返回 false ,且剩余的元素不会再进行检测
function obj5(arr1){
let brr=[];
arr1.forEach(function(a){
let istrue=brr.every(function(b){
return a.id!=b.id;
})
istrue ? brr.push(a):''
})
return brr;
}
js中数组的去重方法总结(比较全)
最新推荐文章于 2024-08-02 14:21:03 发布