博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript数组去重6种方法
阅读量:4953 次
发布时间:2019-06-12

本文共 4502 字,大约阅读时间需要 15 分钟。

数组去重涉及基础知识较多,总结了以下6个方法:

  1. 双重for循环,push新数组;

  2. 双重for循环,splice原数组;

  3. 单个for循环,遍历对象属性;

  4. 单个for循环,sort排序后遍历;

  5. ES5,indexOf,定位去重;

  6. ES6,... 及set方法。

1、双层循环,若有相同的值则跳过,不相同则push进新数组

1 Array.prototype.distinct1 = function(){ 2     var arr  = this, 3         i,j, 4          len = arr.length, 5       result = []; 6  7     for (i = 0; i < len; i++){ 8         for (j = i + 1; j < len; j++ ){ 9             if(arr[i] === arr[j]){    //判断有相等项10                 j = ++i;             // 执行跳出内循环 i = i+1; j=i;11             }12         }13         result.push(arr[i]);14     }15     return result;16 };17 var arr1 = [1,1,'1','1',true,true,'true','true'];18 console.log(arr1.distinct1())    //返回 [1, "1", true, "true"]

 

 2、双层循环,原数组上进行删除操作(splice)

1 Array.prototype.distinct2 = function () { 2     var arr = this, 3         i, 4         j, 5         len = arr.length; 6     for(i = 0; i < len; i++){ 7         for(j = i + 1; j < len; j++){ 8             if (arr[i] === arr[j]){ 9                 arr.splice(j,1);    //判断后将其移除10                 len--;        //原数组长度减111                 j--;            //内部循环索引减112             }13         }14     }15     return arr;16 };    17 var arr2 = [1,1,'1','1',true,true,'true','true'];18 console.log(arr2.distinct2());    //[1, "1", true, "true"]

3、对象属性,利用对象属性名称不能相同,遍历数组,利用obj对象保存数组值

1 // 判断数组值是否已经保存在obj中,未保存则push到新数组并用obj[arr[i]]=1记录保存 2 Array.prototype.distinct3 = function (){  3     var arr = this, 4         i, 5      result = [], 6         obj = {}, 7         len = arr.length; 8     for(i = 0; i < len; i++){ 9         if(!obj[arr[i]]){        //若obj[arr[i]] == false,即obj中查找不到arr[i]属性10             obj[arr[i]] = 1;    //对象属性赋值11             result.push(arr[i]);12         }13     }14     return result;  15 };16 17 var arr3 = [1,1,'1','1',true,true,'true','true'];18 console.log(arr3.distinct3());    //[1, true] ,对象属性默认调用toString()方法,需要优化

 

4、sort(),将数组进行排序,再调用一次for循环

1 Array.prototype.distinct4 = function (){ 2     var arr = this, 3           i, 4         len = arr.length; 5     arr.sort();                    //对传入数组排序 6     var nArr = [arr[0]];        //用arr[0]初始化新数组 7     for (i = 0; i < len; i++){ 8         if(arr[i] !== nArr[nArr.length - 1]){ //与新数组从最后一项向前对比 9             nArr.push(arr[i]);10         }11     }12     return nArr;13 };14 var arr4 = [1,1,'1','1',true,true,'true','true'];15 console.log(arr4.distinct4());    //[1, "1", true, "true"]

 

 5、indexOf() 定位查找

  兼容IE8 indexOf() 方法

Array.prototype.indexOf = Array.prototype.indexOf || function(item) {    for (var i = 0, j = this.length; i < j; i++) {        if (this[i] === item) {            return i;        }    }    return -1;				//未匹配返回-1};

  

  兼容IE8 forEach() 方法

1 Array.prototype.forEach = Array.prototype.forEach || function(callback, thisArg) {2     if (!callback || typeof callback !== 'function') return;3 4     for (var i = 0, j = this.length; i < j; i++) {5         callback.call(thisArg, this[i], i, this);6     }7 }

   5.1 indexOf() for循环一次

1 Array.prototype.distinct5_1 = function (){ 2     var arr = this, 3      result = [], 4          i, 5          len = arr.length; 6  7     for (var i = 0; i < len; i++) { 8         if (result.indexOf(arr[i]) === -1) { 9             result.push(arr[i]);10         }11     }12     return result;13 };

    5.2 indexOf() 结合 forEach(),原数组从第i项开始,只有一个

1 Array.prototype.distinct5_2 = function (){ 2     var arr = this, 3            result = [] ; 4     arr.forEach(function(e, i, arr) { 5         if (arr.indexOf(e) === i) { //indexOf判断元素的值是否与当前索引相等 6             result.push(e); 7         } 8     }); 9 10     return result;11 };

 

  5.3 indexOf() 结合 forEach(),原数组第i项与第i+1项开始比较,未找到返-1

1 Array.prototype.distinct5_3 = function (){ 2     var arr = this, 3      result = [], 4         len = arr.length; 5     arr.forEach(function(e, i ,arr){     //这里利用map,filter方法也可以实现 6         var bool = arr.indexOf(e,i+1);  //从传入参数的下一个索引值开始寻找是否存在重复 7             if(bool === -1){ 8                 result.push(e); 9             }10     });11     return result;12 };

 

1 var arr5 = [1,1,'1','1',true,true,'true','true'];2 console.log(arr5.distinct5_1()); //[1, "1", true, "true"]3 console.log(arr5.distinct5_2());4 console.log(arr5.distinct5_3());

 

 

6.ES6 ... Set()

1 var arr6 = [1,1,'1','1',true,true,'true','true'];2 var arr=[...new Set(arr)];3 console.log(arr);             //[1, "1", true, "true"]

   

  小结,去重方法很多,个人建议直接第五种方法,运行效率会高些,不过ES6的方法更是简单霸气;这6种方法只是js源码,在开发工作中看到的往往都是封装好的,不过基础还是要夯实,才能应对前端框架更新如此快的节奏,轻松上手。。。欢迎指正。

 

原创文章,转载注明出处。

  

转载于:https://www.cnblogs.com/xiaoyiyi/p/8508768.html

你可能感兴趣的文章
定宽320 缩放适配手机屏幕
查看>>
BZOJ 2120 数颜色 【带修改莫队】
查看>>
【noip2004】虫食算——剪枝DFS
查看>>
Codeforces 40 E. Number Table
查看>>
CLR via C#(第3 版)
查看>>
java语法之final
查看>>
关于响应式布局
查看>>
详解ASP.Net 4中的aspnet_regsql.exe
查看>>
python 多进程和多线程的区别
查看>>
hdu1398
查看>>
[android] 网络断开的监听
查看>>
156.Binary Tree Upside Down
查看>>
MongoDB在windows下安装配置
查看>>
Upselling promotion stored procedure
查看>>
sigar
查看>>
iOS7自定义statusbar和navigationbar的若干问题
查看>>
程序员如何提高影响力:手把手教你塑造个人品牌
查看>>
[Locked] Wiggle Sort
查看>>
deque
查看>>
Ext JS学习第十三天 Ext基础之 Ext.Element
查看>>