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中提!

  • 相关阅读:
    打印螺旋矩阵
    关于矩阵的操作
    最大公约数和最小公倍数
    将一个十进制数转化为16进制数
    打印菱形
    DEDECMS织梦全站动态化访问(包括自由列表freelist)及发布内容时自动动态化设置
    单例模式2014/3/27
    模式2014/3/26
    写一些体会2014/3/25
    推荐大家一本学习php模式的书
  • 原文地址:https://www.cnblogs.com/Upton/p/6436360.html
Copyright © 2011-2022 走看看