js 数组排除重复

阅读本文需要了解 “高阶函数”。 请参考:http://blog.csdn.net/wershest/article/details/71036581


1. 最直观,但比较naive的算法:

uniqueArray = a.filter(function(item, pos) {
    return a.indexOf(item) == pos;
});

遍历数组,对于每一个值,查找它在数组中出现的第一个索引(indexOf函数),如果与当前pos不同,则该值有重复。

稍微优化一下,避免在filter的函数中使用外部变量:

uniqueArray = a.filter(function(item, pos, self) {
    return self.indexOf(item) == pos;
});

对于大型数组,这种算法的性能较差(n*n)。

2. 使用hashtable

function uniq(a) {
    var seen = {};
    return a.filter(function(item) {
        return seen.hasOwnProperty(item) ? false : (seen[item] = true);
    });
}

该算法的效率比较好,复杂度是线形的。但它有两个缺点:
1. 在js中hash的key只能是string,它不能区分 1 和 "1"。 uniq([1, "1"]) 返回 [1]。
2. 基于相同的原因,该算法不支持元素是object数组。

如果数组元素都是Number或者String,推荐使用这个算法。

3. 两全其美的办法

综合以上两种算法,遇到哪种类型就用哪种方法:

function uniq(a) {
    var prims = {"boolean":{}, "number":{}, "string":{}}, objs = [];
    return a.filter(function(item) {
        var type = typeof item;
        if(type in prims)
            return prims[type].hasOwnProperty(item) ? false : (prims[type][item] = true);
        else
            return objs.indexOf(item) >= 0 ? false : objs.push(item);
    });
}

4. 先排序
先排序,再遍历,如果当前元素与前一个元素相同,则删除。

function uniq(a) {
    return a.sort().filter(function(item, pos, ary) {
        return !pos || item != ary[pos - 1];
    });
}

这种方法也不适用于 Object 类型的数组,因为,sort函数认为所有的object都相等。

5. ES6 提供了 Set

function uniq(a) {
    return Array.from(new Set(a));
}



参考文档:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值