最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JavaScript基础 - 数组去重方法总结

    正文概述 掘金(YanniLi)   2020-11-23   397

    总结数组去重的方法,方便日后查阅。

    以下例子皆以该数组为基础

    var arr = [
      1, 1, 15, 15,
      'true', 'false',true,
      false, 'false', true, 0, 
      undefined,  null, null, 
      NaN, 'NaN', NaN, 'NaN', false, undefined,
      0, 'a', 'a', 'true', 
      {'name': 'jack', 'age': 18},
      {'age': 18, 'name': 'jack'},
      {'name': 'lucy', 'age': 20},
      {'name': 'lucy', 'age': 22}
    ];
    

    1. Set

    缺点:对象无法去重

    
    function unique (arr) {
      return Array.from(new Set(arr))
    }
    console.log(unique(arr)) // length:16
    
    // [1,15,"true","false",true,false,0,undefined,null,NaN,"NaN","a",{"name":"jack","age":18},{"age":18,"name":"jack"},{"name":"lucy","age":20},{"name":"lucy","age":22}]
    

    或者

    [...new Set(arr)] // 结果跟上面一致
    

    2. Map

    缺点:对象无法去重

    function unique(arr) {
      let map = new Map();
      let array = new Array();  // 数组用于返回结果
      for (let i = 0; i < arr.length; i++) {
        if(map.has(arr[i])) {  // 如果有该key值
          map.set(arr[i], true); 
        } else { 
          map.set(arr[i], false);   // 如果没有该key值
          array .push(arr[i]);
        }
      } 
      return array ;
    }
    
    console.log(unique(arr)) // length: 16
    
    // [1,15,"true","false",true,false,0,undefined,null,NaN,"NaN","a",{"name":"jack","age":18},{"age":18,"name":"jack"},{"name":"lucy","age":20},{"name":"lucy","age":22}]
    

    3. for + splice

    缺点:对象无法去重,NaN无法去重

    function unique(arr){            
      for(var i = 0; i < arr.length; i++){
          for(var j = i + 1; j < arr.length; j++){
              if(arr[i] === arr[j]){
                  arr.splice(j,1);
                  j--;
              }
          }
      }
      return arr;
    }
    
    console.log(unique(arr)) // length: 17
    
    // [1,15,"true","false",true,false,0,undefined,null,NaN,"NaN",NaN, "a",{"name":"jack","age":18},{"age":18,"name":"jack"},{"name":"lucy","age":20},{"name":"lucy","age":22}]
    

    4. for + indexOf

    缺点:对象无法去重,NaN无法去重

    function unique(arr) {
      if (!Array.isArray(arr)) {
        console.log('type error!')
        return
      }
      var array = [];
      for (var i = 0; i < arr.length; i++) {
          if (array .indexOf(arr[i]) === -1) {
              array .push(arr[i])
          }
      }
      return array;
    }
    
    console.log(unique(arr)) // length: 17
    
    // [1,15,"true","false",true,false,0,undefined,null,NaN,"NaN",NaN, "a",{"name":"jack","age":18},{"age":18,"name":"jack"},{"name":"lucy","age":20},{"name":"lucy","age":22}]
    

    5. for + includes

    缺点:对象无法去重

    function unique(arr) {
      if (!Array.isArray(arr)) {
          console.log('type error!')
          return
      }
      var array =[];
      for(var i = 0; i < arr.length; i++) {
        if( !array.includes( arr[i]) ) {
            array.push(arr[i]);
        }
      }
      return array
    }
    
    console.log(unique(arr)) // length: 16
    
    // [1,15,"true","false",true,false,0,undefined,null,NaN,"NaN","a",{"name":"jack","age":18},{"age":18,"name":"jack"},{"name":"lucy","age":20},{"name":"lucy","age":22}]
    

    6. for + sort

    缺点:对数字/字母排序有效,否则需要传入特定条件进行排序

    function unique(arr) {
      if (!Array.isArray(arr)) {
          console.log('type error!')
          return;
      }
      // todo 应该传入条件排序
      arr = arr.sort()
      var arrry= [arr[0]];
      for (var i = 1; i < arr.length; i++) {
          if (arr[i] !== arr[i-1]) {
              arrry.push(arr[i]);
          }
      }
      return arrry;
    }
    
    console.log(unique(arr)) // length: 21
    

    7. filter + hasOwnProperty

    缺点:将object类型都去掉了,仅剩一个

    function unique(arr) {
        var obj = {};
        return arr.filter(function(item, index, arr){
            console.log('typeof item + item', typeof item + item,'>>>>', obj.hasOwnProperty(typeof item + item))
            return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
        })
    }
    console.log(unique(arr)) // length: 13
    

    8. filter + indexOf

    缺点:对象无法去重,不能识别 NaN 和 ”NaN“

    function unique(arr) {
      return arr.filter(function(item, index, arr) {
        //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
        return arr.indexOf(item, 0) === index;
      });
    }
    console.log(unique(arr)) // length: 15
    
    // [1,15,"true","false",true,false,0,undefined,null,"NaN","a",{"name":"jack","age":18},{"age":18,"name":"jack"},{"name":"lucy","age":20},{"name":"lucy","age":22}]
    

    9. reduce + includes

    缺点:对象无法去重

    function unique(arr){
      return arr.reduce((prev,cur) => prev.includes(cur) ? prev : [...prev,cur],[]);
    }
    
    console.log(unique(arr)); // length: 16
    
    // [1,15,"true","false",true,false,0,undefined,null,NaN,"NaN","a",{"name":"jack","age":18},{"age":18,"name":"jack"},{"name":"lucy","age":20},{"name":"lucy","age":22}]
    
    

    10. lodash 工具库

    结果:完美去重

    Lodash: 一个一致性、模块化、高性能的 JavaScript 实用工具库

    var oScript = document.createElement('script');
    oScript.type = 'text/javascript';
    oScript.async = true;
    oScript.src="https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js";
    document.body.append(oScript)
    
    _.uniqWith(arr, _.isEqual); // length: 15
    

    11. 对比

    方法优点缺点
    Set代码量少对象无法去重Map对象无法去重for + splice对象无法去重,NaN无法去重for + indexOf对象无法去重,NaN无法去重for + includes对象无法去重for + sort对数字/字母类较有效需传入特定条件进行排序filter + hasOwnProperty将object类型都去掉了,仅剩一个filter + indexOf对象无法去重,不能识别 NaN 和 ”NaN“reduce + includes对象无法去重lodash.js工具库,使用方便,完美去重

    总结

    以上的方法可以自由组合,除了对象的去重需要特殊处理外,其他的基本都适用。如果数组中掺杂了对象,那么我们只需要判断对象类型,针对对象做特殊的去重处理即可。

    数组对象去重

    以下例子皆以这个数组为前提:

    var arr = [
      {'id': 1, 'name': 'jack', 'age': 18},
      {'id': 1, 'age': 18, 'name': 'jack'},
      {'id': 2, 'name': 'lucy', 'age': 20},
      {'id': 3, 'name': 'lucy', 'age': 22},
      {'id': 3, 'name': 'lucy', 'age': 22},
      {'id': 4, 'name': 'lucy', 'age': 22}
    ]
    

    1. reduce

    function unique(arr){
      let obj = {}
    
      return arr.reduce((prev,cur) => {
        obj[cur.id] ? "" : obj[cur.id] = true && prev.push(cur);
        return prev
      },[]); // 设置 prev 默认类型为数组,并且初始值为空的数组
    }
    
    console.log(unique(arr));
    

    2. Map

    function unique(arr){
        let map = new Map();
        for (let item of arr) {
            if (!map.has(item.id)) {
                map.set(item.id, item);
            }
        }
        return [...map.values()];
    }
    console.log(unique(arr));
    

    3. Map + Object.values()

    function unique(arr){
      let obj = {}
      arr.map(item => {
        obj[item.id] = item
      })
      console.log(obj)
      return Object.values(obj)
    }
    
    console.log(unique(arr));
    

    4. 双重循环

    var temp = []
    function unique(arr){
      arr.forEach(function(a) {
          var check = temp.every(function(b) {
              return a.id !== b.id;
          })
          check ? temp.push(a) : ''
      })
      return temp;
    }
    
    console.log(unique(arr));
    

    5. 冒泡排序法

    function unique(arr){
      for (var i = 0; i < arr.length - 1; i++) {
          for (var j = i + 1; j < arr.length; j++) {
              if (arr[i].id == arr[j].id) {
                  arr.splice(j, 1);
                  j--;
              }
          }
      }
      return arr;
    }
    
    console.log(unique(arr));
    

    起源地下载网 » JavaScript基础 - 数组去重方法总结

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元