美文网首页web前端前端那些事儿
js对数组去重的完整版

js对数组去重的完整版

作者: Stevenzwzhai | 来源:发表于2017-02-24 00:51 被阅读1046次

数组去重是很常见的一个需求,而各种各样的姿势也很多,常见的如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中提!

相关文章

  • 数组的去重和数组中对象的去重

    数组中对象去重 方式1 jq方式 方式2 原生js方式 普通数组的去重 方式1 普通的数组去重js 方式2 Se...

  • js对数组去重的完整版

    数组去重是很常见的一个需求,而各种各样的姿势也很多,常见的如indexOf,或者hash,但是他们还是有缺陷,这里...

  • js数组去重、对象数组去重

    普通数组去重 一、普通数组去重 方法一:遍历数组法 方法二:排序法 方法三:对象法 对象数组去重 方法一:将对象数...

  • js数组去重

    Set结构去重 ES6 提供了新的数据结构 Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。 向 Se...

  • JS数组去重

    方法1:两层for循环,外层循环原数组,内层循环时进行比较。 方法2:利用对象的属性不能相同的特点去重 方法3:利...

  • js数组去重

  • js数组去重

    1.利用对象的属性唯一性去重 2.利用es6的Set

  • js数组去重

  • js 数组去重

  • JS数组去重

    方法一:遍历数组,建立新数组,利用indexOf判断是否存在于新数组中,不存在则push到新数组,最后返回新数组 ...

网友评论

  • b582ce46437d:ES6大法好:Array.from(new Set(array));
    Stevenzwzhai:@景先生_7c24 indexOf是不可以,它一般用来对数字或字符串数组的查询
    dad3c9dac701:indexOf的这个方法不能去重NaN,{},[]
    Stevenzwzhai:我也好想用,但是用不上:joy:

本文标题:js对数组去重的完整版

本文链接:https://www.haomeiwen.com/subject/czliwttx.html