JS 前端数据去重

1.使用 for 循环和 indexOf 方法,复杂度 O(n^2)

javascript 复制代码
function uniqueArray(arr) {
  const result = []
  for (let i=0; i<arr.length; i++) {
    let item = arr[i]
    if (result.indexOf(item) === -1) {
      result.push(item)
    }
  }
  return result
}

2.使用 for 循环和对象,复杂度 O(n^2)

javascript 复制代码
function uniqueArray(arr) {
  const result = []
  const obj = {}
  for (let i = 0; i < arr.length; i++) {
    let item = arr[i]
    if (!obj[item]) {
      result.push(item)
      obj[item] = true
    }
  }
  return result
}

3.使用 filter 方法和 indexOf 方法,复杂度 O(n^2)

javascript 复制代码
function uniqueArray(arr) {
  return arr.filter((item, index, arr) => arr.indexOf(item) === index)
}

4.使用 filter 方法和对象,复杂度 O(n)

javascript 复制代码
function uniqueArray(arr) {
  const obj = {}
  return arr.filter((item) => obj.hasOwnProperty(item) ? false : (obj[item] = true))
}

5.使用 Set 数据结构,复杂度 O(n)

javascript 复制代码
function uniqueArray(arr) {
  return Array.from(new Set(arr))
}

// 使用解构 + Set
function uniqueArray(arr) {
  return [...new Set(arr)]
}

6.使用 Map 数据结构,复杂度 O(n)

javascript 复制代码
function uniqueArray(arr) {
  const map = new Map();
  const result = [];
  for (let i = 0; i < arr.length; i++) {
    let item = arr[i]
    if (!map.has(item)) {
      map.set(item, true);
      result.push(item);
    }
  }
  return result;
}

// or
function uniqueArray(arr) {
  const map = new Map();
  return arr.filter(item => !map.has(item) && map.set(item, true););
}

7.使用双重循环和 splice 方法,复杂度 O(n^2)

javascript 复制代码
function uniqueArray(arr) {
  for (var i = 0; i &lt; arr.length; i++) {
    for (var j = i + 1; j < arr.length; j++) {
      if (arr[i] === arr[j]) {
        arr.splice(j, 1);
        j--;
      }
    }
  }
  return arr;
}

8.使用排序和双指针

使用排序和双指针可以实现 O(nlogn) 的时间复杂度。先对数组进行排序,然后使用双指针遍历数组,如果左指针和右指针指向的值相同,就把右指针向右移动,直到找到不同的值,然后把左指针向右移动,继续遍历。

javascript 复制代码
function uniqueArray(arr) {
  arr.sort();
  let left = 0, right = 1;
  let result = [];

  while (right <= arr.length) {
    if (arr[left] === arr[right]) {
      right ++;
    } else {
      result.push(arr[left]);
      left = right;
      right ++;
    }
  }

  return result;
}

9.使用 reduce 方法和 includes,复杂度 O(n^2)

javascript 复制代码
function uniqueArray(arr) {
  return arr.reduce(function(prev, cur) {
    if (!prev.includes(cur)) {
      prev.push(cur);
    }
    return prev;
  }, []);
}

10.使用递归和 includes,复杂度 O(n^2)

javascript 复制代码
function uniqueArray(arr) {
  if (arr.length === 1) {
    return arr;
  } else {
    const first = arr[0];
    const rest = uniqueArray(arr.slice(1));
    return rest.includes(first) ? rest : [first].concat(rest)
  }
}

11.双层循环,复杂度 O(n^2)

javascript 复制代码
function uniqueArray(arr) {
  var result = [];
  for (var i = 0; i < arr.length; i++) {
    for (var j = 0; j < result.length; j++) {
      if (arr[i] === result[j]) {
        break;
      }
    }
    if (j === result.length) {
      result.push(arr[i]);
    }
  }
  return result;
}
相关推荐
程序员黑豆28 分钟前
鸿蒙应用开发之双向绑定实战:从 V1 到 V2 的完整迁移指南
前端·harmonyos
Escape31 分钟前
为什么你的 AI 越聊越傻?从 Token 到 Agent,彻底搞懂 AI Agent的秘密㊙️
前端·人工智能·后端
李明卫杭州1 小时前
Vue3 响应式概念 ↔ React 对应方案(类组件与函数组件)对照笔记
前端·vue.js·react.js
windliang1 小时前
Claude Code 源码分析(二):CC 的心脏 queryLoop Agent主循环
前端·ai编程·claude
Revolution611 小时前
reactive 对象重新赋值后,表单为什么没有恢复默认值
前端·vue.js·面试
米饭同学i1 小时前
微信小程序 input maxlength 遇上输入法拼音被截断?这是最完整的解决方案
前端
董员外1 小时前
RAG 系统进化论(二):Naive RAG,检索增强生成的最小闭环
前端·人工智能·后端
JasonMa1531 小时前
从零搭建一个微信小程序活动管理平台(一):架构设计与技术选型
javascript·微信小程序·node.js
脾气有点小暴1 小时前
ECharts 伪 3D 柱状图完整注释 + 实现原理说明
前端·3d·信息可视化·vue·echarts
花生了什么事o1 小时前
synchronized 与 ReentrantLock:Java 锁机制原理与实现对比
java·开发语言