文章参考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277


题目

对下列数组去重:

var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];

要求考虑兼容性和效率

方法一
function unique(arr){
var result = [];
for (var i = 0;i<arr.length;i++){
//如果当前数组的第i项已经保存进了临时数组,忽略掉
//否则的话把当前项push到临时数组里面
if(result.indexOf(arr[i]) < 0) result.push(arr[i]);
//indexOf 返回元素在result中的位置,如果没有返回-1;
}
return result;
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));

总结:两个问题:1.加上indexOf()相当于加载两次循环

2.indexOf()在ie9以下不兼容

方法二
function unique(arr){
var result = [];
var hash = {};
for ( var i=0;i<arr.length;i++){
var key = (typeof arr[i]) + arr[i];
if(!hash[key]){
result.push(arr[i]);
hash[key] = true;
}
}
return result;
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));

通过hash表,把已经出现过的元素通过下标的形式存入一个object内。下标的引用比indexOf搜索数组快的多。

方法三
function unique(arr){
var n = [this[0]]; //结果数组
for(var i =1;i<this.length;i++){ //从第二项开始遍历
//如果当前数组的第i项在当前数组中第一次出现的位置不是i
//那么表示第i项是重复的,忽略掉。否则存入结果数组
if(this.indexOf(this[i]) == i) n.push(this[i]);
}
return n;
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));
方法四
function unique(arr){
this.sort();
var re = [this[0]];
for (var i =1;i<this.length;i++){
if( this[i] != re[re,length-1] ){
re.push(this[i]);
}
}
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));

先把数组排序,然后比较相邻的两个值。

方法五
//去重(ES6 Set)
function unique2(array){
return Array.from(new Set(array));
}
var arr = ['aa','bb','cc','',1,0,'1',1,'bb',null,undefine,null];
console.log(unique(arr));

ES6 新方法 form,所以兼容性有问题。

最新文章

  1. C#与C++的发展历程第四 - C#6的新时代
  2. 从Java文件到字节码文件
  3. When to close cursors using MySQLdb
  4. android之location 根据接口获取经纬度信息
  5. SSL简介
  6. Android开发之启动Activity的最佳写法
  7. 较优H圈matlab实现
  8. Chrome App远程控制
  9. 程序员的自我修养:高效使用Google解决问题
  10. JavaScript 节流函数 Throttle 详解
  11. solr与Elasticsearch对比
  12. 使用urllib2+re爬取web网站
  13. MySQL开发——【字符集、校对集】
  14. [solution] JZOJ-5458 质数
  15. 【详细】Android入门到放弃篇-YES OR NO-》各种UI组件,布局管理器,单元Activity
  16. 虚拟DOM与DOM diff算法
  17. 关于ros里ppp拨号隧道比如pptp,l2tp,sstp等等,造成多条路由,ospf的时候需要汇总为一条宣告的解决方案
  18. 2018.10.27 洛谷P2915奶牛混合起来Mixed Up Cows(状压dp)
  19. [Winform]WebKit.Net使用
  20. h5笔记

热门文章

  1. 如何优雅的使用RabbitMQ
  2. DDR的前世与今生(一)
  3. HTML 事件(三) 事件流与事件委托
  4. javascript之Object.defineProperty的奥妙
  5. Node.js:dgram模块实现UDP通信
  6. 普通程序员如何转向AI方向
  7. Solr 排除查询
  8. Spark读写Hbase的二种方式对比
  9. 通过自定义特性,使用EF6拦截器完成创建人、创建时间、更新人、更新时间的统一赋值(使用数据库服务器时间赋值,接上一篇)
  10. R abalone data set