zoukankan      html  css  js  c++  java
  • js对数组去重的完整版

    数组去重是很常见的一个需求,而各种各样的姿势也很多,常见的如indexOf,或者hash,但是他们还是有缺陷,这里我查了一些资料做补充。

    一般方式

    //一般方法->使用indexOf
    Array.prototype.unique = function(){
        var newArr = [];
        //此处改进一下就是直接把第一个元素先放入新数组中,可以减少一次遍历,也就是说var newArr = [this[0]]
        var len = this.length;
        for(var i = 0;i < len; i++){
            if(newArr.indexOf(this[i]) == -1){
                newArr.push(this[i]);
            }
        }
        return newArr;
    }
    

    最快方式

    //使用hash
    Array.prototype.unique = function(){
        var json = {}, newArr = [], len = this.length;
        for(var i = 0; i < len; i++){
            if(typeof json[this[i]] !== "undefined"){
                json[this[i]] = true;
                newArr.push(this[i]);
            }
        }
        return newArr;
    }
    

    温和方式

    Array.prototype.unique = function(){
              //先对数组做一个排序,这样使得一样的数据就会挨在一起
        this.sort();
        var newArr = [this[0]], len = this.length;
        for(var i = 0; i < len; i++){
            if(this[i] !== newArr[newArr.length - 1]){
                newArr.push(this[i]);
            }
        }
        return newArr;
    }
    

    以上就是比较常用的几种数组去重方式,当然,我们最推崇的就是用hash,因为它快,但是我们会发现有时候就不好使了,比如[1,'1'],去重之后就变成了[1],这是为什么呢?
    其实我们在使用hash的时候就是把数组元素作为hash的key值,那么在使用的过程就会把数组元素变成了字符串,所以成了上面结果,再扩展一下,对于Boolean、null等都会有上面的情况,所以我们不能只关注数组元素的值,还要关注它的数据类型。
    关于数据类型的判断,常见的typeof, instanceof。这里我推荐使用Object.prototype.toString.call。
    因此,对于key值就不能是简单的数组元素,而是应该包含该元素的数据类型,如下

    json[this[i]] = {};
    json[this[i]][Object.prototype.toString.call(this[i])] = 1;
    //这里赋值为1,可以统计重复数量,具有更好的扩展性。
    

    完整如下:

    Array.prototype.unique = function(){
        var json = {}, newArr = [], len = this.length;
        for(var i = 0; i < len; i++){
            var temp = Object.prototype.toString.call(this[i]);
            if(typeof json[this[i]] == "undefined"){
                json[this[i]] = {};
                json[this[i]][temp] = 1;
                newArr.push(this[i]);
            }else if(typeof json[this[i]][temp] == "undefined"){
                json[this[i]][temp] = 1;
                newArr.push(this[i]);
            }else{
                json[this[i]][temp]++;
            }
        }
        console.log(json);
        return newArr;
    }
    

    github挂了,没法提交代码,后续会补充代码,以及我工作中总结的一些关于数组的操作,尤其是关于数组对象的一下处理。未完待续。。。

    参考:https://segmentfault.com/a/1190000003984330
    https://zhuanlan.zhihu.com/p/24291761
    补:githubhttps://github.com/Stevenzwzhai/plugs/tree/master/Array-Removal
    这个项目下还有很多平时的总结,大家有兴趣可以看下,顺便start一下,有好的建议欢迎在issue中提!

  • 相关阅读:
    ajax专题
    luogu P1346 电车 最短路
    luogu P1462 通往奥格瑞玛的道路 最短路
    luogu P1328 生活大爆炸版石头剪刀布
    luogu P1315 联合权值 枚举
    luogu P1156 垃圾陷阱 背包问题
    luogu P1217 回文质数 枚举
    luogu P3650 滑雪课程设计 枚举
    luogu1209 修理牛棚 贪心
    luogu P1223 排队接水 贪心
  • 原文地址:https://www.cnblogs.com/Upton/p/6436360.html
Copyright © 2011-2022 走看看