js数组去重的方法

liuxin-673855200 2019-06-28 原文

js数组去重的方法

最近在面试,侥幸面试成功,这里列举一下数组去重的方法
这里我们先随机生成一个10000项的数组,通过不同方法的对数组进行去重,来比较一下速度。

首先生成数组

function product(){
        var arr=[]
          for(var i=0;i<10000;i++){
            var a=randomNum()
              arr.push(a)
          }
          return arr
      }
 function randomNum(){
        return Math.ceil((Math.random()*10000))
 }
 var arr=product()
 console.log(arr)

1.首先是通过双循坏的方法
  声明一个新的空数组,每次对新数组进行检索,如果查不到,则将元素插入。时间复杂度为O(n2)
贴上代码

function isRepeat2(arr){
  var newArr=[];
    for(var i=0;i<arr.length;i++){
          if(newArr.indexOf(arr[i])==-1){//没查到
              newArr.push(arr[i])
          }
    }
    return newArr
}

2.这种思路是先对数组进行排序,然后比较相邻的元素,如果重复就删除。时间复杂度也为O(n2)

由于JS对sort排序进行了优化,会比第一种方法速度要快一些
代码:

function isRepeat(arr){
  arr=arr.sort((a,b)=>{
      return a-b
  })
    for(var i=0;i<arr.length-1;i++){
      if(arr[i]==arr[i+1]){
          arr.splice(i,1)
          i--
      }
    }
    return arr
}

3. 利用hash对象进行排序

function set(arr) {
var hash = {}
var arr1 = []
for (var i of arr) {
if (!hash[i]) {
arr1.push(i)
hash[i] = 1
}
}
return arr1
}

利用hash对象的key值不重复,来判断是否插入新的元素,由于只进行了一次遍历 时间明显缩短。时间复杂度为O(n)
4.利用ES6的Set对象
Set对象的类似于数组,其值不能重复

function isRepeat3(arr){
  const s = new Set();
  arr.forEach(x => s.add(x));
  return arr
}

这种跟第3种速度差不多
下面贴一下四种方式的运行时间比较

console.time()
console.log(isRepeat(arr))
console.timeEnd()
console.time()
console.log(isRepeat2(arr))
console.timeEnd()
console.time()
console.log(isRepeat3(arr))
console.timeEnd()
console.time()
console.log(set(arr))
console.timeEnd()

 

 

可以看到,4种去重方式的运行速度,明显3,4速度要快一些
你学到了吗?
欢迎各位批评指正

发表于 2019-06-28 17:46 淡忘&天涯 阅读() 评论() 编辑 收藏

 

版权声明:本文为liuxin-673855200原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/liuxin-673855200/p/11104059.html

js数组去重的方法的更多相关文章

  1. es6划重点

    es6划重点 1.作用域变量 1.1.let和var对比 1.变量不提升 2.不能重复定义 3.暂存死区 4. […]...

  2. Promise原理讲解 async+await应用(异步回调解决方案)

    1.异步编程 1.1.回调函数 1.2 发布订阅 1.3 观察者模式 1.4 Promise 2.promis […]...

随机推荐

  1. 如何方便快速的在指定文件夹打开cmd

    在平时我们在windows环境中要打开cmd并进入一个指定的文件夹,需要先打开cmd,进入指定的分区,然后再一 […]...

  2. 推荐一款免费的云服务器 “ 三-丰-云”

    推荐一款免费的云服务器 “ 三-丰-云”     三风云官网 : https://www.sanfengyun […]...

  3. Nmap常见扫描方式流量分析

    环境说明 扫描者:manjaro linux , IP地址:192.168.31.160 被扫描者:cento […]...

  4. 搭建 RTMP 服务器

    主要步骤 具体步骤 FAQ docker 搭建版 参考 主要步骤 下载 nginx 的 rtmp 模块 编译n […]...

  5. Python 3.6 性能测试框架Locust安装及使用

    背景   Python3.6 性能测试框架Locust的搭建与使用 基础 python版本:python3.6 […]...

  6. Activiti 用户任务并行动态多实例(多用户执行流程)

    在很多情况下,我们需要多用户共同执行余下流程,比如开会流程: 领导发起开会,选择开会人员(多个) 每个开会人员 […]...

  7. 【纯净镜像】原版Windows7集成USB3.0+NVME补丁+UEFI引导旗舰版下载

    系统简述: 1. 基于MSDN原版Windows7 Ultimate With SP1系统制作,无任何插件和垃 […]...

  8. Flutter 分页功能表格控件

    Flutter 分页功能表格控件 老孟导读:前2天有读者问到是否有带分页功能的表格控件,今天分页功能的表格控件 […]...

展开目录

目录导航