数组去重

2,908 阅读1分钟

数组去重(写在原型上的方法)

一、原始值

1. indexOf去重

if (!Array.prototype.unique) {
    Array.prototype.unique = function () {
        let arr = []
            len = this.length;
        for (let i = 0; i < len; i++) {
            if (arr.indexOf(this[i]) === -1) {
                arr.push(this[i])
            }
        }
        return arr;
    }
}

2. 哈希去重

对象属性的存储采用的时哈希算法

if (!Array.prototype.unique) {
    Array.prototype.unique = function () {
        let arr = [],
            obj = {}
            len = this.length;
        for (let i = 0; i < len; i++) {
            if (!obj[typeof this[i] + this[i]]) {
                arr.push(this[i]);
                obj[typeof this[i] + this[i]] = true;
            }
        }
        return arr;
    }
}

3. include

判断数组是否包含某个值,返回true或false

if (!Array.prototype.unique) {
    Array.prototype.unique = function () {
        var len = this.length;
        for (let i = 0; i < len; i++) {
            if (!arr.includes(this[i])) {
                arr.push(this[i]);
            }
        }
        return arr;
    }
}

4. ES6 set数据结构+.../Array.from()

类数组,成员都是唯一的,没有重复的值;需将结果转换为数组

if (!Array.prototype.unique) {
    Array.prototype.unique = function () {
        let set=new Set(this);
        return [...set];
        // return Array.from(set);
    }
}

set去重小知识点(数组中包含引用类型数据)

我们都知道ES6中set可以实现数组去重

但是如果数组中的数据类型为引用类型时,是无法实现去重的。

示例代码如下:

var arrObject1=[{name:"lisa"},{name:"lisa"},{name:"jennie"},[1,2],[1,2]];
var arrObject2=[1,1,2,3,3];
var set1=new Set(arrObject1);
console.log(Array.from(set1)); // [{name:"lisa"},{name:"lisa"},{name:"jennie"},[1,2],[1,2]]
var set2=new Set(arrObject2);
console.log(Array.from(set2)); // [1,2,3]

5. ES6 map数据结构 + filter

map为键值对的集合,没有某个键,就将其设置为1

if (!Array.prototype.unique) {
    Array.prototype.unique = function () {
        let map=new Map();
        this.filter(item=>!map.has(item)&&map.set(item,1));
    }
}

6、reduce+indexOf

if (!Array.prototype.unique) {
    Array.prototype.unique = function () {
        let arr = this;
        let result=arr.reduce((prev,cur,index,arr)=>{
            prev.indexOf(cur)==-1?prev.push(cur):prev;
            return prev;
        },[])
        return result;
    }
}

二、引用值

如果一个数组中包含多个对象(只有对象),根据对象中的某一个属性进行去重

Array.prototype.unique1 = function(){
    var len = this.length,
        obj = {},
        ret = [];
    for(var i = 0; i < len; i++){
        if(!obj[this[i].id]){
            ret.push(this[i]);
            obj[this[i].id] = true;
        }
    }
    return ret;
}
var arr1 = [{id:"1",name:"yang"},{id:"2",name: "wang"},{id:"1",name:"li"}];
arr1.unique1();