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中提!
js对数组去重的完整版的更多相关文章
- js中数组去重的几种方法
js中数组去重的几种方法 1.遍历数组,一一比较,比较到相同的就删除后面的 function unique(arr){ ...
- JS实现数组去重方法大总结
js数组根据对象中的元素去重: var arr2 = [ { name: "name1", num: "1" }, { name: "name2&qu ...
- Js对于数组去重提高效率一些心得
最近在找工作,好几次面试都问过数组去重的问题.虽然问的都不一样,但是核心思想是没有变的. 第一种是比较常规的方法 思路: 构建一个新的数组存放结果 for循环中每次从原数组中取出一个元素,用这个元素循 ...
- js引用类型数组去重-对象标记法
前言 Js数组去重已经有很多种实现方式:包括逐个检索对比(使用Array.property.indexOf),先排序后对比,使用hash表,利用ES6中的Set()等.这些数组去重办法中速度最快的是h ...
- js对数组去重的方法总结-(2019-1)
最近待业在家,系统地学习了一套js的课程.虽然工作时间真的比较长了,但有些东西只局限在知其然而不知其所以然的程度上,有些知识点通过“血和泪”的经验积累下来,也只是记了结果并没有深究,所以每次听完课都有 ...
- JS实现数组去重方法整理
前言 我们先来看下面的例子,当然来源与网络,地址<删除数组中多个不连续的数组元素的正确姿势> 我们现在将数组中所有的‘ a’ 元素删除: var arr = ['a', 'a', 'b', ...
- js06--利用js给数组去重
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- js中数组去重方法及性能对比
js中数组的 数组去重 常用的数组去重方法以及效率分析: 首先我们先构建一个数组,主要是用于进行去重实验,我们主要实验的量级为1000,10000,100000,500000.具体的生成数组的方法如下 ...
- js实现数组去重的方式(7种)
JS数组去重的方式 例:将下面数组去除重复元素(以多种数据类型为例) const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, und ...
随机推荐
- MySQL入门很简单: 7 触发器
触发器是由事件来触发某个操作,这些事件包括INSERT语句,UPDATE语句和DELETE语句 1.创建触发器 1)创建只有一个执行语句的触发器 例子:再向department表中执行INSERT操作 ...
- IOS 多线程-NSThread 和线程状态
@interface HMViewController () - (IBAction)btnClick; @end @implementation HMViewController - (void)v ...
- selenium 打开浏览器报错java.lang.NoSuchMethodError: org.openqa.selenium.chrome.ChromeOptions.addArguments([Ljava/lang/String;)
java.lang.NoSuchMethodError: org.openqa.selenium.chrome.ChromeOptions.addArguments([Ljava/lang/Strin ...
- 【洛谷2605】[ZJOI2010] 基站选址(线段树维护DP)
点此看题面 大致题意: 有\(n\)个村庄,每个村庄有\(4\)个属性:\(D_i\)表示与村庄\(1\)的距离,\(C_i\)表示建立基站的费用,\(S_i\)表示能将其覆盖的建基站范围,\(W_i ...
- 2295: KMP模式匹配 一(串)
2295: KMP模式匹配 一(串) 时间限制: 1 Sec 内存限制: 128 MB提交: 210 解决: 97[提交][状态][讨论版][命题人:外部导入] 题目描述 求子串的next值,用n ...
- 第35章 WWDG—窗口看门狗—零死角玩转STM32-F429系列
第35章 WWDG—窗口看门狗 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/fir ...
- 3.Mysql集群------Mycat分库分表
前言: 分库分表,在本节里是水平切分,就是多个数据库里包含的表是一模一样的. 只是把字段散列的分到不同的库中. 实践: 1.修改schema.xml 这里是在同一台服务器上建立了4个数据库db1,db ...
- ES6初识-Proxy和Reflect
{ let obj={ time:'2017-03-11', name:'net', _r:123 }; let monitor=new Proxy(obj,{ // 拦截对象属性的读取 get( ...
- 牛客小白月赛1 J おみやげをまらいました 【MAP】
链接:https://www.nowcoder.com/acm/contest/85/J おみやげをまらいました! 蛙蛙还是给你带来了礼物.但它有个小小的要求,那就是你得在石头剪刀布上赢过它才能 ...
- git 常用命令及仓库创建
一.常用命令 1.添加到本地仓库缓存 git add . 2.查看本地仓库状态 git status 3.提交到本地仓库 git commit -am 'project init' 4.连接线上分支 ...