JavaScript数组去重由慢到快由繁到简(优化篇)

前端之家收集整理的这篇文章主要介绍了JavaScript数组去重由慢到快由繁到简(优化篇)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

在进行数组操作时往往会遇到去掉重复项的问题,下面简单介绍下数组去重的方法

indexOf去重

不过,在 IE6-8 下,数组的 indexOf 方法还不存在(虽然这已经算有点古老的话题了O(∩_∩)O~),但是,程序员就要写一个indexOf方法

indexOf还可以以这样的去重思路:

hash去重

以上indexOf正确性没问题,但性能上,两重循环会降低性能。那我们就用hash。

核心是构建了一个 hash 对象来替代 indexOf。空间换时间。注意在 JavaScript 里,对象的键值只能是字符串(当然,ES6提供了Map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的对应,是一种更完善的Hash结构现。),因此需要var key = typeof(item) + item 来区分数值 1 和字符串 '1' 等情况。

那如果你想要'4' 和 4 被认为是相同的话(其他方法同理)

排序后去重

先把数组排序,然后比较相邻的两个值,排序的时候用的JS原生的sort方法,所以非常快。而这个方法的缺陷只有一点,比较字符时按照字符编码的顺序进行排序。所以会看到10排在2前面这种情况。不过在去重中不影响。不过,解决sort的这个问题,是sort方法接受一个参数,这个参数是一个方法

value2) { return 1; } else { return 0; } } [1,5,10,20].sort(compare); //[1,20]

Set去重

ES6提供了新的数据结构Set。它类似于数组,但是成员的值都是唯一的,没有重复的值。现在浏览器正在全面支持,服务端的node也已经支持

方法

推荐一个方法库Underscore.js,在node或浏览器js中都很受欢迎。

score'); _.uniq([1,4]); //[1,4]

测试时间

以上方法均可以用一个简单的方法去测试一下所耗费的时间,然后对各个方法做比较择优:

VM314:3 test: 0.378ms

让数据变得大一点,就随机创建100万个数:

以上所述是小编给大家介绍的JavaScript数组去重由慢到快由繁到简。编程之家 jb51.cc 收集整理的教程希望能对你有所帮助,如果觉得编程之家不错,可分享给好友!感谢支持

猜你在找的JavaScript相关文章