Skip to content

数组去重的几种方法对比

统计信息:字数 2076 阅读5分钟

数组去重分几种情况:数组的项全部是数值;数组的项全部是字符串;数组的项全部是对象;数组的长度

1 indexOf 去重

let array = [1, 2, 4, 2, 3];
function unique(array) {
  let res = [];
  const len = array.length;
  for (let i = 0; i < len; i++) {
    let current = array[i];
    if (res.indexOf(current) === -1) {
      res.push(current)
    }
  }
  return res;
}

首先建立一个结果数组,然后遍历原始数组,判断 indexOf 如果结果数组中没有原始数组,把这一项加入。indexOf 消耗性能。

2 排序数组去重

如果一个数组已经排序,那么把数组看做单向链表,比较当前元素和下一个元素,如果重复直接去掉。性能较好

let array = [1, 2, 2, 2, 3];
function unique(array) {
    const len = array.length;
  for (let i = 0; i < len;) {
    if (array[i] === array[i + 1]) {
      array.splice(i + 1, 1);
    } else {
      i++;
    }
  }
  return array;
}

扩展:多个排序数组合并后去重,使用多指针,将未重复的部分放在新数组中(或者原地数组中去重);

3 filter 去重

适合多种数据类型,需要过滤特殊值的排序(空值等)

let array = [1, 2, 1, 1, 'a', null, undefined];
function unique(array) {
  return array.filter(function(item, index, array){
    return (item && !isNaN(item) &&array.indexOf(item) === index);
  });
}

4 对象去重

数组的每一项是对象

let array = [{value: 1}, {value: 1}, {value: 2}];
function unique(array) {
  var obj = {};
  return array.filter(function(item, index, array){
    // console.log(typeof item + JSON.stringify(item))
    if (obj.hasOwnProperty(typeof item + JSON.stringify(item))) {
      return false;
    }
    return (obj[typeof item + JSON.stringify(item)] = true);
  });
}

5 ES6 Set 去重

ES6 Set实现

// 这是最快捷的方法,适合于纯数值数组的去重,且不含有其他的属性
var unique = (a) => [...new Set(a)]

Last update: November 9, 2024