普通数组去重
方案一
let arr = [0,1,2,3,0,1,3];
let result = arr.filter((self,index,arr) => index === arr.indexOf(self);
console.log(arr); // [0,1,2,3];
思路: 用filter遍历数组;通过indexOf查找原数组中是否有当前值,并且返回存在值得索引,来判断是否跟当前的index相等;
indexOf:用来查找数组中是否包含某值,找到第一个时立马返回当前值的下标 没有则返回 -1;
方案二
let arr = [1,3,4,5,1,3];
let result = [...new Set(arr)];
console.log(result); // [1,3,4,5];
利用ES6中Set集合无重复值的特点去重;
注意:Set集合不是数组 需要展开运算符展开转换成数组;
对象数组去重
let objArr = [{name:'每天学一点'},{name:'开开心心'},{name:'每天学一点'}];
let keys = {};
let result = objArr.reduce((acc,cur) => {
!keys[cur.name] ? keys[cur.name] = true && acc.push(cur) : null;
return acc;
},[]);
如果要去重的数组对象是这样的呢。
let objArr = [
{
name:'每天学一点',
msg:'收获满满'
},
{
name:'每天学一点',
msg:'收获满满'
},
{
name:'开开心心',
msg:'正能量满满'
},
{
msg:'收获满满',
name:'每天学一点'
}
];
let keys = {};
let result = objArr.reduce((acc,cur) => {
!keys[JSON.stringify(cur)] ? keys[JSON.stringify(cur)] = true && acc.push(cur) : null;
return acc;
},[]);
console.log(result);
// [{name:'每天学一点',msg:'收获满满'},{name:'开开心心',msg:'正能量满满'},{msg:'收获满满',name:'每天学一点'}];
// 数组中第一位和最后一位只是key位置不同就当成了两个值
// 解决方案:
// 给对象key值先排序
// key值排序
function sortKeys(obj) {
let _obj = {};
Object.keys(obj).sort().forEach(key => {
_obj[key] = obj[key];
});
return _obj;
}
objArr = objArr.map(obj => {
return sortKeys(obj);
});
// ---- 在执行去重
// ---- console.log(result)
// [{name:'每天学一点',msg:'收获满满'},{name:'开开心心',msg:'正能量满满'}]
思路:
1、新建一个空对象的变量keys;
2、数组中每一项的对象当作key值赋值到keys对象中,其值设为true或者任意值;
3、用对象key无重复的特点来去重;
*最好先给数组对象中的对象key值排序 以免发生key位置不一致导致结果有重复值;