普通数组去重,对象数组去重 方法总结

317 阅读2分钟

普通数组去重

方案一

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位置不一致导致结果有重复值;