在一些后台语言中都内置了一些方法来处理数组或集合中重复的数据。但是js中并没有类似的方法,网上已经有一些方法,但是不够详细。部分代码来源于网络。个人总计如下:大致有4种思路

1)使用两次循环比较原始的写法
易理解效率相对不高

 Array.prototype.unique1 = function () {
var res = [this[0]] //结果数组
for (var i = 1; i < this.length; i++) {
var repeat = false;
for (var j = 0; j < res.length; j++) {
if (res[j] == res[i]) {
repeat = true
break
}
}
if (!repeat) {
//不重复push 结果数组
res.push(this[i])
}
}
return res
}

2)先排序 后对比相邻位置是否相等,若等于push到结果数组

 Array.prototype.unique2 = function () {
this.sort();
var res = [this[0]];
for (var i = 1; i < this.length; i++) {
if (this[i] !== res[res.length - 1]) {
res.push(this[i]);
}
}
return res;
}

3)使用 indexOf 来判断该元素是否存在 indexOf由于还会遍历一次,so,不推荐
 indexof:
  a某个指定的字符串值在字符串中首次出现的位置。
  b检索的字符串值没有出现,则该方法返回 -1。

 //1)
Array.prototype.unique3 = function () {
var res = [this[0]] //结果数组
for (var i = 1; i < this.length; i++) {
if (res.indexOf(this[i]) == -1) n.push(this[i]);
}
return res
}
//2)
Array.prototype.unique4 = function () {
var res = [this[0]]
for (var i = 1; i < this.length; i++)
if (this.indexOf(this[i]) == i) n.push(this[i])
}
return res
}

同样的思路可简写成

arr.filter(function (element, index, self) {
return self.indexOf(element) === index;
});

4)使用对象 通过属性来检测 效换率高,但相对占内存高(空间换时间)推荐使用

  Array.prototype.unique = function () {
var obj = {}
var res = []
for (var i = 0; i < this.length; i++) {
if (!obj[this[i]]) {
res.push(this[i])
obj[this[i]] = 1
}
}
return res;
}

此方法也存在缺陷:dom 伪数组不可以。

如有好的方法欢迎补充

最新文章

  1. LeetCode之283. Move Zeroes
  2. 【HDU 3938】Portal (并查集+离线)
  3. asp.net mvc下的多语言方案 包含Html,Javascript和图片
  4. hibernate 映射 多对一
  5. AD组策略添加本地账号、设置允许ping回显
  6. 利用doScroll在IE浏览器里模仿DOMContentLoaded
  7. 关于“无法定位程序输入点gzdirect于动态链接库zlib1.dll”的问题
  8. winform 窗体大小变化时,如何设置使控件一起按照比例变大
  9. [VBA] excel获取单元格的超链接地址函数
  10. 从反编译的角度去观察C#6.0
  11. SQL截取字符串
  12. 关于nodeJS多线程的支持,目前看来无法实现,讲解v8的一些东西
  13. CentOS7 通过YUM安装MySQL5.7
  14. swift 关于FDFullscreenPopGesture的右滑返回
  15. [Postman]定制Postman(4)
  16. Android一个自定义的进度环:ProgressChart
  17. Vue 导入文件import、路径@和.的区别
  18. yocto-sumo源码解析(五): bitbake/lib/bb/main.py
  19. Syncthing搭建
  20. oracle pl/sql程序

热门文章

  1. 数据库优化案例——————某市中心医院HIS系统
  2. Angular企业级开发(4)-ngResource和REST介绍
  3. 用C语言封装OC对象(耐心阅读,非常重要)
  4. AI人工智能系列随笔
  5. 由js apply与call方法想到的js数据类型(原始类型和引用类型)
  6. TYPESDK手游聚合SDK服务端设计思路与架构之二:服务端设计
  7. Android中的沉浸式状态栏效果
  8. React Native 之 Text的使用
  9. atitit.attilax的软件 架构 理念.docx
  10. mysql 5.7中的用户权限分配相关解读!