定向爆破:数组去重方法总结

66 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

数组去重是工作、面试时很容易碰到的问题,你知道有哪些吗?你是否还在用 空变量 + 双重循环呢?下面是我最近针对此问题进行的总结,希望阅读后对你有所启发!

1. 先定义一个空数组+循环判断往新数组中push

// 思路1
function uniqueArray(arr) {
  const newArr = [];
  let isRepeat;
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    isRepeat = false;
    const newLen = newArr.length;
    for (let j = 0; j < newLen; j++) {
      if (newArr[j] === arr[i]) {
        isRepeat = true;
        break;
      }
    }
    if (!isRepeat) {
      newArr.push(arr[i])
    }
  }
  return newArr;
}
// 思路2
function uniqueArray(arr) {
  const newArr = [];
  let isRepeat;
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    isRepeat = false;
    if (newArr.indexOf(item) > -1) {
        isRepeat = true;
    }
    if (!isRepeat) {
      newArr.push(arr[i])
    }
  }
  return newArr;
}
// 思路3
function uniqueArray(arr) {
  const newArr = [];
  let isRepeat;
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    isRepeat = false;
    if (newArr.includes(item)) {
        isRepeat = true;
    }
    if (!isRepeat) {
      newArr.push(arr[i])
    }
  }
  return newArr;
}
// 思路4
function uniqueArr2(arr) {
  const newArr = [];
  let isRepeat;
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    isRepeat = false;
    for (let j = i + 1; j < len; j++) {
      if (arr[i] === arr[j]) {
        isRepeat = true;
        break;
      }
    }
    if (!isRepeat) {
      newArr.push(arr[i])
    }
  }
  return newArr;
}
// 思路5
function uniqueArray(arr) {
  var result = [];
  arr.forEach(function(item, index) {
      if (arr.indexOf(item) === index) {
        result.push(e);
      }
  })
  return result;
}

小结:双重循环是容易想到的思路,逻辑上也很清晰;思路1是往一个空盒子里放数据,放之前先看看这个盒子里是否已经有此数据,没有的话,再放入,已经有了,则不放;

先看看这个盒子里是否已经有此数据,就这个判断有几种方式,思路1是整体循环新盒子,思路2、思路3我们通过newArr.indexOf(item) === -1,或者通过newArr.includes(item);

思路4:内层循环是为了比较外层循环当前项的后面是否有与当前项相等的项,有则表示重复则不放入新数组,没有表示不重复则放入;

2. 通过数组的filter()方法

function uniqueArray(arr) {
  return arr.filter((item,index) => {
    return arr.indexOf(item) === index;
  })
}

3. 通过数组sort()方法,先排序,再比较相邻的是否相等

function uniqueArray(arr) {
  const newArr = [];
  arr.sort();
  const len = arr.length;
  for (let i = 0; i < len; i++) {
    if (arr[i] !== arr[i+1]) {
      newArr.push(arr[i])
    }
  }
  return newArr;
}

4. 使用ES6的Set

function uniqueArray(arr) {
  // return Array.from(new Set(arr))
  return [...new Set(arr)]
}

5. 利用对象的属性

function uniqueArray(arr) {
  let tmpObj = {};
  let result = [];
  let len = arr.length;
  for (let i = 0; i < len; i++) {
    if (!tmpObj[arr[i]]) {
      tmpObj[arr[i]] = 1;
      result.push(arr[i]);
    }
  }
  return result;
}

小结

工作中用到最多的是第五种方式,利用对象属性是不可重复,整体效率、性价比高。