数组去重实现

使用 Set、Map、filter 等方式实现数组去重

问题

实现数组去重,要求掌握多种实现方式:Set、Map、filter。

解答

使用 Set

function uniqueBySet(arr) {
  // Set 自动去除重复值
  return [...new Set(arr)];
}

// 测试
const arr = [1, 2, 2, 3, 3, 3, 4];
console.log(uniqueBySet(arr)); // [1, 2, 3, 4]

使用 Map

function uniqueByMap(arr) {
  const map = new Map();
  const result = [];
  
  for (const item of arr) {
    // 用 Map 记录已出现的元素
    if (!map.has(item)) {
      map.set(item, true);
      result.push(item);
    }
  }
  
  return result;
}

// 测试
const arr = [1, 2, 2, 3, 3, 3, 4];
console.log(uniqueByMap(arr)); // [1, 2, 3, 4]

使用 filter

function uniqueByFilter(arr) {
  // 只保留第一次出现的元素
  return arr.filter((item, index) => arr.indexOf(item) === index);
}

// 测试
const arr = [1, 2, 2, 3, 3, 3, 4];
console.log(uniqueByFilter(arr)); // [1, 2, 3, 4]

使用 reduce

function uniqueByReduce(arr) {
  return arr.reduce((acc, item) => {
    // 累加器中不存在则添加
    if (!acc.includes(item)) {
      acc.push(item);
    }
    return acc;
  }, []);
}

// 测试
const arr = [1, 2, 2, 3, 3, 3, 4];
console.log(uniqueByReduce(arr)); // [1, 2, 3, 4]

对象数组去重

function uniqueByKey(arr, key) {
  const map = new Map();
  
  return arr.filter(item => {
    const value = item[key];
    if (map.has(value)) {
      return false;
    }
    map.set(value, true);
    return true;
  });
}

// 测试
const users = [
  { id: 1, name: 'Alice' },
  { id: 2, name: 'Bob' },
  { id: 1, name: 'Alice2' }
];
console.log(uniqueByKey(users, 'id'));
// [{ id: 1, name: 'Alice' }, { id: 2, name: 'Bob' }]

关键点

  • Set 方案:最简洁,一行代码,时间复杂度 O(n)
  • Map 方案:适合需要额外处理的场景,时间复杂度 O(n)
  • filter + indexOf:代码直观,但时间复杂度 O(n²)
  • reduce + includes:同样 O(n²),大数组慎用
  • 对象数组:需要指定去重的 key,用 Map 记录已出现的值