• 数组去重的几种方法


    持续更新地址:LqZww's blog

    利用Set + Array.from

    在不考虑兼容性的情况下,此方法最简单。

    注意:此方法无法去掉数组里的空对象({})。

    var arr = [0, 0, 1, 1, '2', '2', true, true, false, false, undefined, undefined, null, null, NaN, NaN, {}, {}];
    
    function unique(arr) {
      return Array.from(new Set(arr))
    }
    
    console.log(unique(arr))    // (10) [0, 1, "2", true, false, undefined, null, NaN, {…}, {…}]
    

    ECMAScript6入门 - Set和Map数据结构

    ECMAScript6入门 - Array.from()


    利用Set + ...

    注意:此方法无法去掉数组里的空对象({})。

    var arr = [0, 0, 1, 1, '2', '2', true, true, false, false, undefined, undefined, null, null, NaN, NaN, {}, {}];
    
    function unique(arr) {
      if (!Array.isArray(arr)) {
        console.log('error')
        return
      }
      return [...new Set(arr)]
    }
    
    console.log(unique(arr))    // (10) [0, 1, "2", true, false, undefined, null, NaN, {…}, {…}]
    

    ECMAScript6入门 - 扩展运算符


    利用indexOf

    indexOf()方法返回在数组中可以找到一个给定元素的第一个索引,如果不存在,则返回-1。

    注意:此方法无法去掉数组里的NaN和空对象({})。

    var arr = [0, 0, 1, 1, '2', '2', true, true, false, false, undefined, undefined, null, null, NaN, NaN, {}, {}];
    
    function unique(arr) {
      if (!Array.isArray(arr)) {
        console.log('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))    // (11) [0, 1, "2", true, false, undefined, null, NaN, NaN, {…}, {…}]
    

    MDN - Array.prototype.indexOf()


    利用filter

    注意:此方法无法去掉数组里的NaN和空对象({})。

    var arr = [0, 0, 1, 1, '2', '2', true, true, false, false, undefined, undefined, null, null, NaN, NaN, {}, {}];
    
    function unique(arr) {
      var array = arr.filter(function(item, index, arr) {
        return arr.indexOf(item) === index;
      })
      return array;
    }
    
    console.log(unique(arr))    // (9) [0, 1, "2", true, false, undefined, null, {…}, {…}]
    

    MDN - Array.prototype.filter()


    利用sort()

    sort()方法用原地算法对数组的元素进行排序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的。

    先利用sort()对数组进行排序,排序后用for循环遍历并对相邻元素做对比。

    注意:此方法无法去掉数组里的NaN和空对象({})。

    var arr = [0, 0, 1, 1, '2', '2', true, true, false, false, undefined, undefined, null, null, NaN, NaN, {}, {}];
    
    function unique(arr) {
      if (!Array.isArray(arr)) {
        console.log('error')
        return;
      }
      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))    // (11) [0, 1, "2", NaN, NaN, {…}, {…}, false, null, true, undefined]
    

    MDN - Array.prototype.sort()


    利用includes

    includes()方法用来判断一个数组是否包含一个指定的值,如果包含则返回true,否则返回false。

    注意:此方法无法去掉数组里的空对象({})。

    var arr = [0, 0, 1, 1, '2', '2', true, true, false, false, undefined, undefined, null, null, NaN, NaN, {}, {}];
    
    function unique(arr) {
      if (!Array.isArray(arr)) {
        console.log('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))    // (10) [0, 1, "2", true, false, undefined, null, NaN, {…}, {…}]
    

    MDN - Array.prototype.includes()


    利用双重for循环

    注意:此方法无法去掉数组里的NaN和空对象({})。

    var arr = [0, 0, 1, 1, '2', '2', true, true, false, false, undefined, undefined, null, null, NaN, NaN, {}, {}];
    
    function unique(arr) {
      var array = [];
      for (var i = 0; i < arr.length; i++) {
        for (var j = 0; j < array.length; j++) {
          if (arr[i] === array[j]) {
            break;
          }
        }
        if (j === array.length) {
          array.push(arr[i])
        }
      }
      return array;
    }
    
    console.log(unique(arr))    // (11) [0, 1, "2", true, false, undefined, null, NaN, NaN, {…}, {…}]
    

    利用hasOwnProperty()

    hasOwnProperty()方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键)。

    var arr = [0, 0, 1, 1, '2', '2', true, true, false, false, undefined, undefined, null, null, NaN, NaN, {}, {}];
    
    function unique(arr) {
      var obj = {};
      return arr.filter(function(item, index, arr) {
        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
      })
    }
    
    console.log(unique(arr))    // (9) [0, 1, "2", true, false, undefined, null, NaN, {…}]
    

    该方法可以实现全部去重

    注意:此方法有缺陷,如果有多个对象,去重后的结果只有第一个对象,后面的对象将会全部消失

    MDN - Object.prototype.hasOwnProperty()

  • 相关阅读:
    次小生成树
    [bzoj5329] P4606 [SDOI2018]战略游戏
    CF487E Tourists
    P3225 [HNOI2012]矿场搭建
    CF #636 (Div. 3) 对应题号CF1343
    P3469 [POI2008]BLO-Blockade
    大假期集训模拟赛12
    大假期集训模拟赛11
    大假期集训模拟赛10
    小奇画画——BFS
  • 原文地址:https://www.cnblogs.com/LqZww/p/13603067.html
Copyright © 2020-2023  润新知