zoukankan      html  css  js  c++  java
  • 数组去重----es6&es5&数组对象去重

    es6方法:

    普通数组:

    1.使用Array.from(new Set(arr));

    /*
    * @param oldArr 带有重复项的旧数组
    * @param newArr 去除重复项之后的新数组
    * */
    let oldArr = [1, 1, 1, 2, 3, 2, 4, 4, 4, 9, 9, 0, 0, NaN, NaN];
    let newArr = Array.from(new Set(oldArr));
    console.log(newArr);  // [1, 2, 3, 4, 9, 0, NaN]

    解释:

    Set对象

    Set对象允许存储任何类型的唯一值,无论是原始值或者是对象引用。它可以是任何类型的单个值的集合。Set中的元素只会出现一次,即Set中的元素是唯一的。
    语法:new Set([iterable]);
    参数:iterable,如果传递一个可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等),它的所有元素将被添加到新的 Set中。如果不指定此参数或其值为null,则新的Set为空。

    let testArr = [0, 1, 1, 2, 3, 3, 3, 3, 4, NaN, NaN, undefined, undefined];
    let setTestArr = new Set(testArr);
    console.log(setTestArr);  // Set(7) {0,1, 2, 3, 4, NaN, undefined}
    from对象

    Array.from()方法从一个类似数组或可迭代的对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等) 中创建一个新的数组实例。

    let testArr = [1, 1, 2, 3, 3, 3, 3, 4, NaN, NaN, undefined, undefined];
    let setTestArr = new Set(testArr);
    console.log(setTestArr);  // {1, 2, 3, 4, NaN, undefined}
    
    let newArr = Array.from(setTestArr);
    console.log(newArr);  // [1, 2, 3, 4, NaN, undefined]

    es6以前:

    方法一:

    先排序,后比较, 缺点:得到了排序后的数组,打乱原有的顺序

    /**
     * @param {number[]} nums
     * @return {number}
     */
    var removeDuplicates = function(nums) {
        nums.sort()
        for(var i=0;i<nums.length;i++){
            if(nums[i]===nums[i+1]){
                nums.splice(i,1)
                i=i-1;
            }
        }
    };

    方法二:

    双层循环,外层循环元素,内层循环时比较值

    如果有相同的值则跳过,不相同则push进数组

    Array.prototype.distinct = function(){
     var arr = this,
      result = [],
      i,
      j,
      len = arr.length;
     for(i = 0; i < len; i++){
      for(j = i + 1; j < len; j++){
       if(arr[i] === arr[j]){
        j = ++i;
       }
      }
      result.push(arr[i]);
     }
     return result;
    }
    var arra = [1,2,3,4,4,1,1,2,1,1,1];
    arra.distinct();    //返回[3,4,2,1]

    方法三:利用splice直接在原数组进行操作

    双层循环,外层循环元素,内层循环时比较值

    值相同时,则删去这个值

    注意点:删除元素之后,需要将数组的长度也减1.

    Array.prototype.distinct = function (){
     var arr = this,
      i,
      j,
      len = arr.length;
     for(i = 0; i < len; i++){
      for(j = i + 1; j < len; j++){
       if(arr[i] == arr[j]){
        arr.splice(j,1);
        len--;
        j--;
       }
      }
     }
     return arr;
    };
    var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
    var b = a.distinct();
    console.log(b.toString()); //1,2,3,4,5,6,56

    方法四:利用indexOf以及forEach

    Array.prototype.distinct = function (){
     var arr = this,
      result = [],
      len = arr.length;
     arr.forEach(function(v, i ,arr){  //这里利用map,filter方法也可以实现
      var bool = arr.indexOf(v,i+1);  //从传入参数的下一个索引值开始寻找是否存在重复
      if(bool === -1){
       result.push(v);
      }
     })
     return result;
    };
    var a = [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,3,3,2,3,3,2,2,1,23,1,23,2,3,2,3,2,3];
    var b = a.distinct();
    console.log(b.toString()); //1,23,2,3

    数组对象去重-----多个数组对象比较可以先利用concat合并

    方法三:利用对象的属性不能相同的特点进行去重-----适用于数组对象

    Array.prototype.distinct = function (){
     var arr = this,
      i,
      obj = {},
      result = [],
      len = arr.length;
     for(i = 0; i< arr.length; i++){
      if(!obj[arr[i]]){ //如果能查找到,证明数组元素重复了
       obj[arr[i]] = 1;
       result.push(arr[i]);
      }
     }
     return result;
    };
    var a = [1,2,3,4,5,6,5,3,2,4,56,4,1,2,1,1,1,1,1,1,];
    var b = a.distinct();
    console.log(b.toString()); //1,2,3,4,5,6,56

    参考:

    https://www.jb51.net/article/118657.htm

    https://itpoet.cn/2018/01/17/es6-array-eliminate-redundancy/#more

  • 相关阅读:
    MySQL数据库的安装与配置
    java中的反射机制
    详谈设计模式之单列模式
    servlet内部转发与重定向
    servlet基础语句总结
    Servlet映射的俩种方法以及优缺点
    eclipse和idea的快捷键比较及idea如何调节eclipse的快捷键
    servlet
    JDK下载与安装教程
    正则表达式查询
  • 原文地址:https://www.cnblogs.com/echo-hui/p/9602668.html
Copyright © 2011-2022 走看看