JavaScript数组去重6种方法

数组去重涉及基础知识较多,总结了以下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--;        //原数组长度减1
11                 j--;            //内部循环索引减1
12             }
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() 方法

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 }

  兼容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

时间: 2024-11-08 22:21:18

JavaScript数组去重6种方法的相关文章

javaScript数组去重两种方法

var arr = ["c", "a", "z", "a", "x", "a", "a", "z", "c", "x", "a", "x"] var obj={}; for(var i=0;i<arr.length;i++) { if(arr[i] in obj)

Javascript数组去重的几种方法

Javascript数组去重的几种方法 新建空数组,通过for...of(ES6)循环遍历,通过indexOf判断元素是否在新数组中存在,将不存在的(indexOf(n)==-1)元素push到新数组中: let arr = [1,1,2,2,3,6,3,77,88,5,98,9,7,2,7,5,3,4,2]; function removeDup_indexOf(originalArr){ let newArr = []; for(n of originalArr){ if(newArr.in

JavaScript数组去重方法及测试结果

最近看到一些人的去面试web前端,都说碰到过问JavaScript数组去重的问题,我也学习了一下做下总结. 实际上最有代表性也就三种方法:数组双重循环,对象哈希,排序后去重. 这三种方法我都做了性能测试,有兴趣的朋友可以去试试,这是测试地址 双重循环最慢(不是一般的慢),对象哈希是最快的,排序后去重根据浏览器不同比对象哈希慢2-3倍

JavaScript数组去重的7种方式

1.利用额外数组 function unique(array) {    if (!Array.isArray(array)) return;     let newArray = [];    for(let i=0, len=array.length; i<len; i++) {        let itemAtIndex = array[i];        if (!newArray.includes(itemAtIndex)) { // newArray.indexOf(itemAt

javascript数组去重算法-----4(另一种写法)

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>javascript数组去重算法-----3</title> 6 </head> 7 <body> 8 <script> 9 var arr = [1,1,2,2,3,2,2,3,3,1,1,4,4,5

javascript数组去重算法-----4(另一种写法__2)

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>javascript数组去重算法-----3</title> 6 </head> 7 <body> 8 <script> 9 var arr = [1,1,2,2,3,2,2,3,3,1,1,4,4,5

Javascript数组的5种迭代方法

#Javascript数组的5种迭代方法 数组当中定义了5个迭代方法,传入这些方法中的函数会接受三个参数,数组项的值,该项在数组的位置,和数组对象本身,以下是5个迭代方法的作用. 1.every方法: 对数组中的每一项运行给定函数,如果该函数对每一项都返回true,则返回true. let arr1 = [1,2,3,4,5,6]; let arr2 = [-1,-2,-3,-4,-5,-6]; let every1 = arr1.every((item,index,arr)=>{ return

JavaScript 数组去重

JavaScript 数组去重 Why underscore (觉得这部分眼熟的可以直接跳到下一段了...) 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对话,你会学到很多.为什么是 underscore?最主要的原因是 underscore 简短精悍(约 1.5k 行),封装了 100 多个有用的方法,耦合度低,非常适合逐个方法阅读,适合楼主这样的 JavaScript

javascript数组去重算法-----5

1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>javascript数组去重算法-----3</title> 6 </head> 7 <body> 8 <script> 9 var arr = [1,1,2,2,3,2,2,3,3,1,1,4,4,5