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

js对数组去重的完整版的更多相关文章

  1. js中数组去重的几种方法

    js中数组去重的几种方法         1.遍历数组,一一比较,比较到相同的就删除后面的                 function unique(arr){                 ...

  2. JS实现数组去重方法大总结

    js数组根据对象中的元素去重: var arr2 = [ { name: "name1", num: "1" }, { name: "name2&qu ...

  3. Js对于数组去重提高效率一些心得

    最近在找工作,好几次面试都问过数组去重的问题.虽然问的都不一样,但是核心思想是没有变的. 第一种是比较常规的方法 思路: 构建一个新的数组存放结果 for循环中每次从原数组中取出一个元素,用这个元素循 ...

  4. js引用类型数组去重-对象标记法

    前言 Js数组去重已经有很多种实现方式:包括逐个检索对比(使用Array.property.indexOf),先排序后对比,使用hash表,利用ES6中的Set()等.这些数组去重办法中速度最快的是h ...

  5. js对数组去重的方法总结-(2019-1)

    最近待业在家,系统地学习了一套js的课程.虽然工作时间真的比较长了,但有些东西只局限在知其然而不知其所以然的程度上,有些知识点通过“血和泪”的经验积累下来,也只是记了结果并没有深究,所以每次听完课都有 ...

  6. JS实现数组去重方法整理

    前言 我们先来看下面的例子,当然来源与网络,地址<删除数组中多个不连续的数组元素的正确姿势> 我们现在将数组中所有的‘ a’ 元素删除: var arr = ['a', 'a', 'b', ...

  7. js06--利用js给数组去重

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  8. js中数组去重方法及性能对比

    js中数组的 数组去重 常用的数组去重方法以及效率分析: 首先我们先构建一个数组,主要是用于进行去重实验,我们主要实验的量级为1000,10000,100000,500000.具体的生成数组的方法如下 ...

  9. js实现数组去重的方式(7种)

    JS数组去重的方式 例:将下面数组去除重复元素(以多种数据类型为例) const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, und ...

随机推荐

  1. MySQL安装和简单操作

    MySQL数据库安装与配置详解 MySQL的安装请参考下面这篇博客,讲述的非常详细,各种截图也很清晰.http://www.cnblogs.com/sshoub/p/4321640.html MySQ ...

  2. 2月4号学习的一个SSM整合项目,第一课

    本文引自:https://github.com/Sunybyjava/seckill  原作者:sunybyjava@gmail.com seckill 一个整合SSM框架的高并发和商品秒杀项目,学习 ...

  3. 2017.10.13 Java中引用类型变量的创建及使用&循环高级写法

    今日内容介绍 1.引用类型变量的创建及使用 2.流程控制语句之选择语句 3.流程控制语句之循环语句 4.循环高级 ###01创建引用类型变量公式     * A: 创建引用类型变量公式         ...

  4. caffe RandomOrderChannels

    就是将rgb图的3个channel随机打乱顺序,给定一个概率值是否执行这个操作,v系列模型的概率一般都设置的为0 void RandomOrderChannels(const cv::Mat& ...

  5. java的四个元注解 @Retention @Target @Document @Inherited

    1.  @Retention  :注解的保留位置 @Retention(RetentionPolicy.SOURCE)  //注解仅存在于源码中,在class字节码文件中不包含 @Retention( ...

  6. JSON格式自动解析遇到的调用方法问题.fromJson() ..readValue()

    所使用的API Store是 聚合数据 使用 手机归属地查询 功能 因百度的apistore.baidu.com 2016年12月开始至今天不接受新用户调取.聚合数据一个接口免费. 一.通过谷歌的go ...

  7. JavaScript_DOM学习篇_图片切换小案例

    今天开始学习DOM操作,下面写一个小案例来巩固下知识点. DOM: document object model (文档对象模型) 根据id获取页面元素 : 如: var xx = document.g ...

  8. js加减乘除精确计算

    Javascript精确计算时的bug JS无法进行精确计算的bug 在做CRM,二代审核需求审核详情页面时.需要按比例(后端传类似0.8的小数)把用户输入的数字显示在不同的地方. 在做dubheIn ...

  9. (排班表二)后台动态绘制Grid表格

    后台动态绘制值班表(Grid表格 列名不固定) 要求:表头除了值班人姓名,还要显示日期,及每天的星期值,用斜杠‘/’分隔.即:几号/星期几 最终实现的效果:根据查询的年月显示每个值班人查询月份每天的值 ...

  10. [MYSQL笔记0]MYSQL的安装

    mysql是一种关系型数据库管理系统.以mysql5.7版本为例,安装过程如下: 首先百度出mysql的官网,进入:(以下是自己安装失败的过程,直接下拉最后看大佬的安装过程吧,就是那个红红的网址) 找 ...