去重三种方法

2023-05-16

数组去重三种方法

问题情境

去除数组中重复的元素,输出不重复的元素数组

思路方向

  1. 将数组中重复的元素删除
  2. 将数组中不重复的元素取出
  3. 利用其它 JavaScript 特性和 API 直接去重

这一思路中有些 API 涉及ES6中的某些知识暂不提及

方法一利用数组对数组中的元素进行比较取出不重复元素去重

原理

创建一个新数组存放元素,遍历原数组中的元素,如果原数组中的某个元素没有与新数组中的元素重复就把该元素放进新数组中

流程

  1. 先定义一个新的数组,用来存储不重复的元素
  2. 利用循环将原数组中的每个元素,逐个取出与新数组中的元素进行比较
  3. 如果有相等的值则结束循环,如果循环结束后新数组的长度与新数组的循环变量相等,那么说明新数组中没有雨原数组重复的元素,此时,元素组中的元素添加进新数组中
  4. 最后返回新数组
function unique(arr) {
    var result = [];
    for (var i = 0; i < arr.length; i++) {
        for (var j = 0; j < result.length; j++) {
            //此时说明遍历新数组中元素后,新数组中有与原数组中重复的元素,跳出循环
            if (result[j] == arr[i]) {
                break;
            }
        }
       
        if (result.length == j) {
             //此时说明遍历新数组中所有元素后,新数组中没有与原数组中重复的元素,把该元素放进新数组中
            result[j] = arr[i];
        }
    }
    return result;
}

注意

  1. 该方法是通过循环对数组进行遍历,效率较低,如果数据过多会占用较多的内存。如果对效率要求较高,不推荐使用
  2. 该方法逻辑简单,容易理解,推荐初学者尝试

方法二利用对象的重名属性被覆盖进行去重

原理

创建一个对象存放数据,遍历原数组中的所有元素,每查找一个元素,就把该元素作为属性名放进创建的对象中
根据对象的特点,如果属性名有重复的会被后面的属性名覆盖,最终只会有一个该属性名

流程

  1. 先创建一个对象,用来存储数组中的元素作为属性名
  2. 遍历数组中的每一项,把每一项作为对象的属性名
  3. 遍历对象,将对象中的属性名作为元素存入数组中
function unique(arr) {
    var obj = {};
    for (var i = 0; i < arr.length; i++) {
        //遍历数组,将数组中的每一项作为属性名放进对象中,如果有重名属性名,会自动覆盖
        obj[arr[i]] = i;
    }
    var result = [];
    for (var key in obj) {
        //取出对象中的属性名作为元素存入数组中,对象的属性名为 string 类型需要将其转换成 number 类型
        result.push(Number(key));
    }
    return result;
}

注意

  1. 该方法由于是利用对象将数组元素作为属性名存入,所以去重后的元素为 string 类型,如果后续还会对排序后的数组进行操作,需要将元素转换成 number 类型
  2. 该方法中对象的属性值可以任意赋值,最终返回结果只取出属性名

方法三利用数组API删除重复元素去重

原理

利用数组中的splice()方法将重复的元素删除

流程

  1. 循环遍历数组,遍历都从数组的头部开始,将元素与后面的每一个元素比较
  2. 如果有重复的元素,将该位置的元素删除,并将循环变量减一
function unique(arr) {
    //从数组的第一个元素开始遍历
    for (var i = 0; i < arr.length; i++) {
        //遍历后面的元素
        for (var j = i + 1; j < arr.length; j++) {
            //将前面的元素与后面的元素比较,如果相等则删除
            if (arr[i] == arr[j]) {
               arr.splice(j, 1);
                j--;
            } 
        }
    }
    return arr;
}

注意

  1. 该方法会对原数组进行修改,如果不想在原数组中进行操作不推荐使用
  2. 该方法中的第二层循环中的循环变量减一,是因为splice()删除数组中的元素后,数组元素的下标会减一,相当于元素向前移了一位,因此为了不遗漏元素,需要减一
  3. 该方法通过循环对数组进行遍历,效率较低,如果数组元素太多会影响速度

总结

  1. 方法一利用新数组与原数组重元素对比去重是将不重复的元素取出存入新数组中达到去重的效果
  2. 方法二利用对象将元素作为对象的属性名去重是将重复的覆盖(相当于合并)达到去重的效果
  3. 方法三利用 splice() 方法去重是将重复的元素删除达到去重的效果
    以上只是自己在使用中总结的方法,尚不是全部的方法,如果不能满足,还请见谅。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

去重三种方法 的相关文章

  • C++课后练习

    题目需求 xff1a 编写一个程序 xff0c 它要求用户首先输入其名 xff0c 再输入其姓 然后程序使用一个逗号和空格组合起来 xff0c 并存储和显示组合结果 请使用char数组和头文件cstring 中的函数 xff0c 下面是该程
  • 像睿智一样简单地使用 Shiro

    加我微信索要我正在使用的 Apacher Shiro参考手册中文版学习 pdf 我们一起学习吧 Apache Shiro 中文文档 Apache Shiro 教程 Docs4dev Apache Shiro 是一个功能强大且易于使用的 Ja
  • Zookeeper 安装

    单机版 1 下载 tar gz 2 解压到 usr local zookeeper 下 3 在任何地方 xff08 我是在zookeeper bin 同级下 xff09 创建一个data文件夹 xff0c 用于存放运行时缓存数据 4 在 c
  • 【推荐系统算法之多任务学习】

    推荐系统算法之多任务学习 引言多任务学习设计思路ESMM模型实验 MMOE模型 引言 本文主要是在组队学习 xff0c pytorch复习推荐模型课程中 xff0c 学习课程笔记进行的总结 多任务学习 多任务学习是指模型在同一时间可以学习多
  • Idea快捷键

    1 进入 返回方法快捷键 Ctrl 43 B 进入光标所在方法定义的地方或返回该方法被使用的地方 xff08 代替Ctrl 43 鼠标点击方法进入方式 xff0c 避免了手指在键盘和鼠标之间切换 xff0c 非常好用的快捷键 xff09 C
  • ASP.NET C# 获取当前日期 时间 年 月 日 时 分 秒

    转贴 xff09 在 ASP net c 中 我们可以通过使用DataTime这个类来获取当前的时间 通过调用类中的各种方法我们可以获取不同的时间 xff1a 如 xff1a 日期 xff08 2008 09 04 xff09 时间 xff
  • ASP.NET中的几种弹出框提示基本方法

    NET程序的开发过程中 xff0c 常常需要和用户进行信息交互 xff0c 对话框的出现将解决了这些问题 xff0c 下面是本人对常用对话框使用的小结 xff0c 希望对大家有所帮助 我们在 NET程序的开发过程中 xff0c 常常需要和用
  • 单链表的就地逆置(头插,就地,递归)

    http blog csdn net lycnjupt article details 47103433 https blog csdn net v xchen v article details 53067448 单链表的就地逆置是指辅助
  • Panads(四):数据清洗——对缺失值的处理

    文章目录 一 处理缺失值的四个函数二 使用1 1 数据样子1 2 处理 一 处理缺失值的四个函数 isnull函数 xff1a 检测是否是空值 xff0c 可用于df和series notnull函数 xff1a 检测是否是空值 xff0c
  • 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析

    2019 07 13 单片机数字钟 xff08 调时 xff0c 调时闪烁 xff0c 万年历 xff0c 年月日 xff09 超详细解析 发表日期 xff1a 2019 07 13 单片机开发板 xff1a 巫妖王2 0 xff0c 使用
  • MATLAB轨迹规划 发给ROS中机器人实现仿真运动

    MATLAB轨迹规划 发给ROS中机器人实现仿真运动 现象如图所示 xff1a 0 matlab 与 ROS 通信 xff1a https blog csdn net qq 40569926 article details 11216287
  • 树莓派 Ubuntu mate 16.04使用VNC开启远程桌面

    1 安装 vncserver sudo apt span class token operator span get span class token operator span y install vnc4server 2 启动 vncs
  • js for in 循环出现bug

    这样使用for in循环时可能会有一种bug for let item in list 原因 xff1a for in循环会把某个类型的原型 prototype 中方法与属性给遍历出来 xff0c 所以这可能会导致代码中出现意外的错误 解决
  • 面试官:Spring中用了哪些设计模式?

    spring中常用的设计模式达到九种 xff0c 我们举例说明 以后再也不怕面试官问我 xff1a Spring中用了哪些设计模式了 1 简单工厂模式 又叫做静态工厂方法 xff08 StaticFactory Method xff09 模
  • 论文笔记 | Learning Deep Features for Discriminative Localization

    作者 Bolei Zhou Aditya Khosla Agata Lapedriza Aude Oliva Antonio Torralba Bolei Zhou Abstract 受到NIN 的启发 xff0c 将global aver
  • stm32 编码器配置

    stm32f103 void TIM4 Encoder Config void GPIO InitTypeDef GPIO InitStructure span class hljs comment span TIM TimeBaseIni
  • 树莓派部署(三):安装teamviewer远程软件

    安装teamviewer远程软件 下载Teamviewer安装因受网络原因影响 xff0c 国外源安装依赖失败则需要切换源一 修改文件二 安装依赖三 安装Teamviewer三 启动Teamviewer 不用命令行启动可忽略 下载Teamv
  • 【数字图像处理】MATLAB实现直方图均衡化

    直方图均衡化的MATLAB实现 目录 1 回顾 直方图均衡化2 代码实现 1 回顾 直方图均衡化 基本原理 直方图均衡化方法的基本思想是 xff1a 对在图像中像素个数多的灰度级进行展宽 xff0c 而对像素个数少的灰度级进行缩减 xff0
  • 【NCC】之一:从Pearson相关系数到模板匹配的NCC方法

    文章目录 lt center gt NCC Normalized Cross Correlation 1 Pearson相关系数 2 协方差 covariance 3 方差 variance 4 模板匹配中的NCC方法5 实现过程6 测试结
  • ST-Link使用和配置总结

    xff08 1 xff09 ST Link实物参考图 xff08 2 xff09 ST Link 引脚介绍和接线方式 ST Link SWD引脚连接方式 参考链接1 xff1a https blog csdn net xinghuanmei

随机推荐

  • CentOS安装CMake

    文章目录 1 问题背景2 前言3 步骤 1 问题背景 最近想玩玩CLion远程调试JDK源码 xff0c 需要用到CMake xff0c 因此来安装 2 前言 需要先看CLion支持哪个版本的CMake xff0c 再下载对应的版本 本文采
  • 跟丛博,学习CMMI2.0

    CMMI2 0 xff0c 三天的学习非常高强度 xff0c 学习了两门课 xff1a 2天的Foundations of Capability和1天的Building Development Excellence 内容多 xff0c 讲义
  • strtok的实现与原理

    该函数包含在 34 string h 34 头文件中 函数原型 xff1a char strtok char str constchar delimiters 函数功能 xff1a 切割字符串 xff0c 将str切分成一个个子串 函数参数
  • Java入门小知识(++a和a++的区别)

    关于java中 43 43 a和a 43 43 的区别 与C语言中的一致 43 43 a xff1a 先进行自增运算 xff0c 在进行表达式运算 a 43 43 xff1a 先进行表达式运算 xff0c 在进行自增运算 下面用一个实例来加
  • Linux VNC搭建方法

    首先介绍下VNC xff0c VNC是类似于向日葵的远程桌面控制工具 xff0c 非常好用 本文详细介绍了VNC的搭建方法与使用教程 yum安装指令 yum install y tigervnc server 复制服务文件放到配置文件夹下
  • (Linux)Ubuntu查看系统版本

    uname a 查看操作系统的发行版号和操作系统版本 Command uname a Result Linux SERVER 5 19 0 35 generic 36 Ubuntu SMP PREEMPT DYNAMIC Fri Feb 3
  • aes-128 速度测试

    官方白皮书 xff1a Intel Advanced Encryption Standard AES New Instructions Set pdf https software intel com zh cn articles inte
  • 【Feature Denosing】Feature Denoising for Improving Adversarial Robustness

    摘要 对图像分类系统的对抗攻击 xff0c 给卷积网络带去挑战的同时 xff0c 也提供了一个理解他们的机会 对抗扰动使得网络提取的特征包含噪声 受这个观察启发 xff0c 我们执行feature denoising 具体来说 xff0c
  • Tomcat8.5配置https启动报空指针错误

    Tomcat8 5配置https启动报空指针错误 报错信息tomcat SSL配置Tomcat8 5 8及以上而外配置 SSL别名获取 报错信息 报错代码 span class token number 02 span span class
  • python琐事系列1:关于如何真正的在vscode用gpu跑代码

    你们要的完整代码 xff1a span class token punctuation span span class token comment 使用 IntelliSense 了解相关属性 span span class token c
  • 影响力最大化 CELF 成本效益延迟转发算法

    文章目录 简介CELF Cost Effective Lazy Forward Algorithm算法原理算法实现代码实现实例测试 简介 对于影响力最大化问题 xff0c 我以前写过几个blog 影响力最大化 IC模型 43 贪心算法 影响
  • 单片机对底层寄存器的操作

    最近项目用到了国产的一款单片机 xff0c 没有例程的支持 xff0c 需要自己从头开始写底层 又感受到了自己本科刚学习51的时候的浮躁 xff0c 不懂得如何操作底层的寄存器 xff0c 只是一味的抄写别人的例程 xff0c 然后进行简单
  • 如何使用策略模式,优化代码里的if-else?

    什么是策略模式 策略模式属于行为型模式 xff0c 类的行为可以根据不同的策略在运行中更改 策略模式的作用 策略模式主要解决了使用if else所带来的复杂性和难以维护的问题 策略模式的架构图 Strategy 策略接口 xff1a 定义抽
  • VNC 连接桌面灰色

    在使用VNC Veiwer连接腾讯云的过程中 xff0c VNC总是灰色的 大多数博客都说是 修改配置文件 vnc xstartup 尝试了很久无果 百度了下面这个错误 Can t find file root vnc VM 0 15 ub
  • C#控件学习--选择类控件

    下拉组合框控件 xff08 ComboBox控件 xff09 创建只可以选择的下拉框 通过设置控件的DropDownStyle属性 xff0c 可以将ComboBox控件设置为可以选择的下拉框 DropDownStyle 属性有3个属性值
  • 云计算之弹性伸缩

    案例1 xff1a 2009年 xff0c 第一次淘宝双十一活动 xff0c 每秒订单只有400笔 xff0c 支付达到极限每秒200笔 2015年淘宝双十一 xff0c 每秒订单创建24万笔 xff0c 支付达到了每秒18 59万笔 每秒
  • Vue2.x与3.x生命周期

    生命周期 一个框架从创建到销毁一系列的过程叫生命周期 在生命周期的过程中会执行相应的函数叫钩子函数 生命周期钩子 61 生命周期函数 61 生命周期事件 过程 beforeCreate 开始创建一个vue实例 初始化vue实例 xff0c
  • 国内银行卡BIN号(Bank Identification Number)速查简表

    转载 xff1a https blog csdn net qq 37960324 article details 82981824 国内银行卡BIN号 Bank Identification Number 速查简表 银行名称 银行卡 卡BI
  • 判断一个对象是否为数组的4种方法

    问题描述 在js中判断数据类型通常使用typeof xff0c 但是typeof在判断数组和对象时的结果都是object console span class token punctuation span span class token
  • 去重三种方法

    数组去重三种方法 问题情境 去除数组中重复的元素 输出不重复的元素数组 思路方向 将数组中重复的元素删除将数组中不重复的元素取出利用其它 JavaScript 特性和 API 直接去重 这一思路中有些 API 涉及ES6中的某些知识暂不提及