zoukankan      html  css  js  c++  java
  • 简单去重比较/复杂数据去重处理

    简单去重比较

    准备测试代码:

    const arr1 = Array.from (new Array (100000), (item, index) => {
      return index;
    });
    const arr2 = Array.from (new Array (50000), (item, index) => {
      return index * 2;
    });
    console.log ('开始测试');
    const start = new Date().getTime();
    distinct(arr1, arr2); // 去重方法
    const end = new Date ().getTime ();
    console.log ('测试结束');
    console.log ('测试时间' + (end - start) / 1000 + 's');

    一:filter + indexOf

    function distinct(arr1, arr2) {
      console.log('filter + indexOf');
      const arr = [...arr1, ...arr2];
      return arr.filter((item, index) => {
        return arr.indexOf(item) === index;
      });
    }

    效果:时间11s

    二:双重循环,删除(splice)重复项

    function distinct(a, b) {
      console.log('双重for循环');
      const arr = a.concat(b);
      for (let i = 0, len = arr.length; i < len; i++) {
        for (let j = i + 1; j < len; j++) {
          if (arr[i] == arr[j]) {
            arr.splice(j, 1);
            // splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一
            len--;
            j--;
          }
        }
      }
      return arr
    }

    效果:22s

     三、includes + push

    function distinct(arr1, arr2) {
      console.log('includes + push新数组');
      const arr = [...arr1, ...arr2];
      const result = [];
      for (item of arr) {
        !result.includes(item) && result.push(item);
      }
      return result;
    }

    效果:11s

     

    四、先排序(sort),然后比较临近2个

    function distinct(arr1, arr2) {
      console.log('先排序, 比较临近的2个 然后push');
      let arr = [...arr1, ...arr2];
      arr = arr.sort((a, b) => {return a - b});
      const result = [];
      for (let i = 0, len = arr.length; i < len; i++) {
        (arr[i] !== arr[i + 1]) && result.push(arr[i]);
      }
      return result;
    }

    效果:0.03s

    四、使用set

    function distinct(arr1, arr2) {
      console.log('使用set');
      const arr = [...arr1, ...arr2];
      return Array.from(new Set(arr));
    }

    效果:0.04s

    五、 for循环配合对象使用,然后push, 优缺点,obj中不区分数据类型,导致number和string 值相同会被过滤掉

    function distinct(arr1, arr2) {
      console.log('for循环配合对象使用,然后push');
      // const arr = [...arr1, ...arr2];
      // const arr = [1, 2, 3, '1', 2, '3'];
      const len = arr.length;
      const obj = {};
      const result = [];
      for (let i of arr) {
        if (!obj[i]) {
          result.push(i);
          obj[i] = 1
        }
      }
      // for (let i = 0; i < len; i++){
      //   if (!obj[arr[i]]) {
      //     console.log(obj[i]);
      //     result.push(arr[i]);
      //     obj[arr[i]] = 1;
      //   }
      // }return result;
    }

    效果:0.03s

    六、reduce

    function distinct(arr1, arr2) {
      console.log('reduce');
      const arr = [...arr1, ...arr2];
      arr.reduce((prev, cur) => {
        if (!prev.includes(cur)) {
          return [...prev, cur];
        } else {
          return prev;
        }
      }, []);
    }

    效果:110s

     数据复杂的去重

    准备数据代码

    console.log ('开始测试');
    const start = new Date().getTime();
    const arr = [
      {
        name: '禹丹丹',
        age: 18,
        stuId: '001',
        family: [
          {
            brother: '1',
            bage: 12,
          },
          {
            mother: '2',
            mage: 20,
          },
          {
            father: '3',
            fage: 10,
          },
        ],
      },
      {
        name: '江西元',
        age: 18,
        stuId: '002'
      },
      {
        name: '韩力明',
        age: 18,
        stuId: '003'
      },
      {
        name: '禹丹丹',
        age: 18,
        stuId: '002'
      },
      {
        name: '禹丹丹',
        age: 18,
        stuId: '001'
      },
    ];
    distinct(arr);
    const end = new Date().getTime();
    console.log('测试结束');
    console.log('测试时间' + (end - start) / 1000 + 's');

    一、双重 for循环

    function distinct(arr) {
      console.log('双重for循环');
      for (let i = 0, len = arr.length; i < len; i++) {
        for (let j = i + 1; j < len; j++) {
          if (arr[i].stuId === arr[j].stuId) {
            arr.splice(j, 1);
            // splice 会改变数组长度,所以要将数组长度 len 和下标 j 减一
            len--;
            j--;
          }
        }
      }
      console.log(arr);
      return arr
    }

     二、for of 配合obj

    function distinct(arr) {
      const result = [];
      const obj = {};
      for (item of arr) {
        if (!obj[item.stuId]) {
          result.push(item);
          obj[item.stuId] = true;
        }
      }
      console.log(result);
      return result;
    }

     三、reduce+obj  和方式二类似

    function distinct(arr) {
      const obj = {}; // 标识是否存在重复flag
      const newArr = arr.reduce((prev, cur) => {
        if (!obj[cur.stuId]) {
          obj[cur.stuId] = true;
          return [...prev, cur];
        }
        return prev;
      }, []);
      console.log(newArr);
      return newArr;
    }

    你对生活笑,生活不会对你哭。
  • 相关阅读:
    菜鸟涂鸦作品展_No.29
    菜鸟涂鸦作品展_No.27
    菜鸟涂鸦作品展_No.26
    关注的前沿动态
    货币转换
    第二周总结
    老鼠
    71 打印沙漏
    学习总结0.0
    第五周作业
  • 原文地址:https://www.cnblogs.com/adanxiaobo/p/11764805.html
Copyright © 2011-2022 走看看