JavaScript数组去重的常见方法 Set filter indexOf

news2025/1/12 15:51:24

JavaScript实现对象深拷贝的方法(5种)

  • 知识回调(不懂就看这儿!)
  • 场景复现
  • 实现数组去重的五种方法
    • 1.Set()+Array.from()
    • 2.filter() + indexOf()
    • 3.for 嵌套 for,splice 去重
    • 4.利用Map()
    • 5.利用includes
  • 实际开发问题解决
    • 1.采用Object.keys()获取键值
    • 2.filter() indexOf()筛选有效数据
    • 3.Set() Array.from()数组去重

知识回调(不懂就看这儿!)

知识专栏专栏链接
JavaScript知识专栏https://blog.csdn.net/xsl_hr/category_12024214.html?spm=1001.2014.3001.5482

有关JavaScript的相关知识可以前往JavaScript知识专栏查看复习!!

场景复现

在近期的前端学习中,接触到了小程序和uniapp,对于列表或者数据的展示来说,很多情况下是需要限制展示条数的。下面给出一个具体的需求!!

具体需求卡片区的内容最多展示四条数据

方法采用JS原生函数获取键值并去重

最终效果
在这里插入图片描述

下面我们来通过代码示例来详细介绍五种常见的去重方法。 👇👇👇

实现数组去重的五种方法

将下面数组去除重复元素(以多种数据类型为例)

const arr = [1, 2, 2, 'abc', 'abc', true, true, false, false, undefined, undefined, NaN, NaN]

1.Set()+Array.from()

Set方法是最简单的方法,因为Set只存储唯一值。

  • Set对象:是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即Set中的元素是唯一的。
  • Array.from() 方法:对一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例。
const result = Array.from(new Set(arr))
console.log(result) // [ 1, 2, 'abc', true, false, undefined, NaN ]

注意

  • 以上去重方式对NaN和undefined类型去重也是有效的,是因为NaN和undefined都可以被存储在Set中,
  • NaN之间被视为相同的值(尽管在js中:NaN !== NaN)。

2.filter() + indexOf()

filter方法会对满足条件的元素存放到一个新数组中,结合indexOf方法进行判断。

  • filter() 方法:会创建一个新数组,其包含通过所提供函数实现的测试的所有元素。
function removeDuplicate(arr) {
  return arr.filter((item, index) => {
    return arr.indexOf(item) === index
  })
}

const result = removeDuplicate(arr)
console.log(result) // [ 1, 2, 'abc', true, false, undefined ]

注意

  • 这里的输出结果中不包含NaN,是因为indexOf()无法对NaN进行判断,即arr.indexOf(item) === index返回结果为false。(测试如下👇👇👇)
const testArr = [1, 'a', NaN]
console.log(testArr.indexOf(NaN)) // -1

3.for 嵌套 for,splice 去重

利用Object.assign(), 第一个参数必须是空对象

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]){         //第一个等同于第二个,splice方法删除第二个
                    arr.splice(j,1);
                    j--;
                }
            }
        }
return arr;
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr))
    //[1, "true", 15, false, undefined, NaN, NaN, "NaN", "a", {…}, {…}]     //NaN和{}没有去重,两个null直接消失了

双层循环,外层循环元素,内层循环时比较值。值相同时,则删去这个值。

4.利用Map()

Map对象是JavaScript提供的一种数据结构,结构为键值对形式,将数组元素作为map的键存入,然后结合has()set()方法判断键是否重复。

  function removeDuplicate(arr) {
  const map = new Map()
  const newArr = []

  arr.forEach(item => {
    if (!map.has(item)) { // has()用于判断map是否包为item的属性值
      map.set(item, true) // 使用set()将item设置到map中,并设置其属性值为true
      newArr.push(item)
    }
  })
  return newArr
}

const result = removeDuplicate(arr)
console.log(result) // [ 1, 2, 'abc', true, false, undefined, NaN ]

5.利用includes

function unique(arr) {
    if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    var array =[];
    for(var i = 0; i < arr.length; i++) {
            if( !array.includes( arr[i]) ) {//includes 检测数组是否有某个值
                    array.push(arr[i]);
              }
    }
    return array
}
var arr = [1,1,'true','true',true,true,15,15,false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{},{}];
    console.log(unique(arr))
    //[1, "true", true, 15, false, undefined, null, NaN, "NaN", 0, "a", {…}, {…}]     //{}没有去重

实际开发问题解决

首先我们来看看后端返回的数据,我们需要将数据的键值获取到,然后渲染到相应的小标签上。
在这里插入图片描述
下图绿色的标签即为渲染上去的效果,至于为什么只有两个被渲染了,原因很简单,因为加了某些限制条件,所以第三条数据被筛选掉了。
在这里插入图片描述

1.采用Object.keys()获取键值

在之前的文章中,我们讲过如何获取到数组对象的键值。

JavaScript获取数组对象里面的键(key)和值(value)

在实际代码中,我们这样解决:👇👇👇
在这里插入图片描述
于是轻松拿到了键值
在这里插入图片描述

2.filter() indexOf()筛选有效数据

这里我们拿到的键值并不全是有效值,因为涉及到有的数据不满足条件,所以我们要进行下一步过滤操作。
在这里插入图片描述

// 筛选出有效的数据
          tagOldList.filter(item => {
            contentData[item].filter((itemitem: { issueState: number; }) => {
              if(itemitem.issueState != 0 ) {
                tagArr.push(item)
              }
            })
          })

筛选过后的结果如下:
在这里插入图片描述
我们不难发现,筛选过后的结果有很多重复的元素,因为在对数据进行筛选时使用了push方法,导致很多重复的元素都被装进了数组当中,所以我们需要对数组进行相同元素合并。

3.Set() Array.from()数组去重

在这里插入图片描述

 tagList = Array.from(new Set(tagArr))

去重之后的效果如下:👇👇
在这里插入图片描述
此时,我们拿到了有效且不重复的数据。


以上就是关于实现数组查重的常见方法分享,相信看完这篇文章的小伙伴们一定能运用这些方法在项目开发中。当然,可能有不足的地方,欢迎大家在评论区留言指正!

下期文章将介绍JS截取数组和字符串的相关内容~
感兴趣的小伙伴可以订阅本专栏,方便后续了解学习~
觉得这篇文章有用的小伙伴们可以点赞➕收藏➕关注哦~

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/601908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何入门编程

随着信息技术的快速发展&#xff0c;编程已经成为一个越来越重要的技能。那么&#xff0c;我们该如何入门编程呢&#xff1f;欢迎大家积极讨论 一、自学编程需要注意什么&#xff1f; 对于我个人的理解&#xff0c;其实自学编程最重要的就是兴趣。你得培养编程兴趣。 所以在学…

linuxOPS基础_linux文本文件统计及查找

wc命令 显示文件信息 语法 \# wc [选项] 文件名称选项选项说明-l表示lines&#xff0c;行数&#xff08;以回车/换行符为标准&#xff09;-w表示words&#xff0c;单词数 依照空格来判断单词数量-c表示bytes&#xff0c;字节数&#xff08;空格&#xff0c;回车&#xff0c;换…

【LED子系统深度剖析】十、详细实现流程(番外篇)

个人主页:董哥聊技术 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强公司! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1、LED驱动初始化流程1.1 LED驱动匹配以及设备的创建1.1.1 gpio_led_probe1.1.2 gpi…

[SpringBoot]Service与Controller层

目录 关于Service 关于Controller 关于各组件的处理流程 补充&#xff1a; Service保证数据完整性是怎么体现的&#xff1f; 以下代表复制属性&#xff0c;把来源adminAddNewParam复制到目标 admin里面 关于Service Service的核心价值在于&#xff1a;组织业务流程&#…

gaussDB的schema创建查询,及其查询下面的表列,修改列类型

修改列类型与众不同 alter table adqm_safe_data_encrypt_job_instance alter COLUMN state TYPE INT4 alter COLUMN state TYPE INT4 pg_catalog.pg_namespace来查看当前数据库中全部的Schema select oid,* from pg_catalog.pg_namespace; 创建schema create schema gs_d…

vscode 配置rust、golang代码格式化方法

一共分三步&#xff1a; 点击左下角齿轮按钮&#xff0c;点击Settings&#xff0c;如下图&#xff1a;点击右上角切换到Settings.json文件。如下图增加rust、golang 配置如下&#xff0c;假如存在默认格式化配置请注释或删除。重启vscode ide&#xff0c;​尝试编写rust、gola…

HTML5+CSS3+JS小实例:简约的垂直选项卡

实例:简约的垂直选项卡 技术栈:HTML+CSS+JS 字体图标库:font-awesome 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="v…

【LED子系统深度剖析】八、小试牛刀

个人主页:董哥聊技术 我是董哥,高级嵌入式软件开发工程师,从事嵌入式Linux驱动开发和系统开发,曾就职于世界500强公司! 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1、硬件管脚确定2、设备树配置3、子系统配置4、编译烧录5、验证5.1 设备树验证5.2 驱…

MySQL — 主从复制介绍

文章目录 主从复制一、概述二、原理三、 搭建主从复制结构3.1 服务器准备3.2 主库配置3.3 从库配置 主从复制 一、概述 ​ 主从复制是指将主数据库的DDL和DML操作通过二进制日志传到从库服务器中&#xff0c;然后在从库上对这些日志重新执行&#xff08;也叫重做&#xff09;…

16-Vue3中常用的 Composition API

目录 1、什么是组合式 API&#xff1f;2、拉开序幕的setup3、ref函数4、reactive函数5、Vue3.0中的响应式原理5.1 vue2.x的响应式5.2 Vue3.0的响应式 6、reactive对比ref7、setup的两个注意点8、计算属性与监视8.1 computed函数8.2 watch函数8.3 watchEffect函数 9、 生命周期1…

chatgpt赋能python:用Python编写AI:从入门到精通

用Python编写AI&#xff1a;从入门到精通 人工智能&#xff08;AI&#xff09;一直是计算机科学领域的热门话题。随着AI技术的成熟&#xff0c;越来越多的公司开始在其业务中应用AI。Python是机器学习和人工智能领域最流行的编程语言之一&#xff0c;Python提供了众多强大的库…

探索C++与Live555实现RTSP服务器的艺术

探索C与Live555实现RTSP服务器的艺术 一、引言&#xff08;Introduction&#xff09;1.1 RTSP服务器的重要性&#xff08;Importance of RTSP Server&#xff09;1.2 C与Live555库的优势&#xff08;Advantages of C and Live555&#xff09;1.3 可能用到的类和接口介绍 二、C与…

LLM时代,探索式数据分析的升级之路有哪些新助攻?

在这个信息爆炸的时代&#xff0c;数据已经成为我们生活、工作中不可或缺的重要资源。大量的数据犹如一座座金矿&#xff0c;蕴藏着无尽的价值。然而&#xff0c;如果无法从数据中提取出知识和信息并加以有效利用&#xff0c;那么数据本身并不能驱动和引领技术应用取得成功。如…

Java程序设计入门教程 -- 一维数组

目录 一维数组创建 1.声明数组 2.分配数组内存空间 3.数组元素访问 数组初始化 1.静态初始化 2.动态初始化 一维数组的拷贝 1.数组元素的拷贝 2.数组名的拷贝 一维数组创建 1.声明数组 声明一个一维数组的方法很简单&#xff0c;格式如下&#xff1a; 数据类型名[ ] …

解决使用json配置文件删除k8s中namespace解析json报错的问题

报错提示如下&#xff1a; C:\Users\jiangcheng>curl -k -H "Content-Type: application/json" -X PUT --data-binary dev.json http://127.0.0.1:8081/api/v1/namespaces/dev/finalize { "kind": "Status", "apiVersion": "…

Unity2D骨骼动画制作之单张图片编辑

1、打开骨骼制作面板 在Sprite Editor左侧选项&#xff0c;选择Skinning Editor 2、 &#xff08;1&#xff09;骨骼制作 Preview Pose 预览模式&#xff0c;可以预览动作并不会真正的改变设置 Reset Pose 将角色骨骼和关节恢复到原始位置 Edit Bone 编辑骨骼&#xff0c;…

bert中文文本摘要代码(3)

bert中文文本摘要代码 写在最前面关于BERT使用transformers库进行微调 train.py自定义参数迭代训练验证评估更新损失绘图主函数 test.pytop_k或top_p采样sample_generate函数generate_file函数主函数 写在最前面 熟悉bert&#xff0b;文本摘要的下游任务微调的代码&#xff0c…

网络安全合规-数据出境安全评估

&#xff08;一&#xff09;数据出境安全评估的适用范围为&#xff1a; 数据处理者向境外提供重要数据&#xff1b; 关键信息基础设施运营者和处理100万人以上个人信息的数据处理者向境外提供个人信息&#xff1b;自上年1月1日起累计向境外提供10万人个人信息或者1万人敏感个…

浮点数在内存中的存储

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C语言学习分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C语言知识   &#x1f51d;&#x1f51d; 浮点数在内存的存储 1. 前言&#…

vue3+WebRTC拉流(正确姿势)

vue3WebRTC拉流&#xff08;正确姿势&#xff09; 文章目录 vue3WebRTC拉流&#xff08;正确姿势&#xff09;缘由一、webRtc拉流是什么&#xff1f;1.实时通信&#xff1a;2.网络穿越&#xff1a;3.媒体处理&#xff1a;4.数据通道&#xff1a;5.使用场景: 二、使用webRtc引用…