找出数组中重复的元素js方法(三种)

3,905 阅读2分钟

测试数组:let arr = [1, 2, 6, 6, 6, 2, 3, 20, 20];

方法一 1. 排序 2. 遍历比较是否相等 3.去重

      function getSameArr(Arr) {
        // 入参是引用类型数据拷贝的是引用,在内部改变的话,外部也会改变
        let result = [];
        let len = Arr.length;
        Arr.sort(function (a, b) {
          return a - b; // increase 升序(从小到大)排列    b-a decrease
        });
        for (var i = 0; i < len - 1; i++) {
          if (Arr[i] === Arr[i + 1]) {
            result.push(Arr[i]);
          }
        }
        return Array.from(new Set(result));
      }
      getSameArr(arr);
     
方法二 1. 根据集合具有唯一性,若是add元素后size还没有变化说明此元素是重复的 2. 去重
      
      function useSet(Arr) {
        let result = [];
        let len = Arr.length;
        let set = new Set();
        for (var i = 0; i < len; i++) {
          let sizeLen = set.size;
          set.add(Arr[i]);
          // 集合具有唯一性
          if (sizeLen === set.size) {
            // 说明此元素Arr[i]是重复的
            result.push(Arr[i]);
          }
        }
        return Array.from(new Set(result));
      }
      useSet(arr);
方法三 1. 通过使用Array.prototype.indexOf(searchElement,fromIndex)查找重复元素 2. 去重
      
      // Array.prototype.indexOf(searchElement,fromIndex) searchElement要查找的元素。fromIndex 可选 开始查找的位置。如果该索引值大于或等于数组长度,意味着不会在数组里查找,返回 -1。如果参数中提供的索引值是一个负值,则将其作为数组末尾的一个抵消,即 -1 表示从最后一个元素开始查找,-2 表示从倒数第二个元素开始查找,以此类推。注意:如果参数中提供的索引值是一个负值,并不改变其查找顺序,查找顺序仍然是从前向后查询数组。如果抵消后的索引值仍小于 0,则整个数组都将会被查询。其默认值为 0。
      // 返回值 首个被找到的元素在数组中的索引位置; 若没有找到则返回 -1。
      function useIndexOf(Arr) {
        let result = [];
        let len = Arr.length;
        for (var i = 0; i < len; i++) {
          let currentEl = Arr[i];
          if (Arr.indexOf(currentEl, i + 1) != -1) {
            // 说明重复
            result.push(currentEl);
          }
        }

        return Array.from(new Set(result));
      }
      useIndexOf(arr);