当前位置: 首页 > news >正文

JS中数组如何去重(ES6新增的Set集合类型)+经典two sum面试题

现在有这么一个重复数组:

const arr = ['a','a','b','a','b','c']

只推荐简单高效的方法,复杂繁琐的方法不做推荐

方法一:

const res = [...new Set(arr)]

Set类型是什么呢?

Set 是ES6新增的一种新集合类型具体知识点可以看下面附录:

根据上面的知识点,我们可以得到:

console.log(...new Set(arr)) // a b c

所以去重也可以这么实现:

const res = Array.from(new Set(arr)) // Array.from将类数组转换成数组
// or
const res = Array.of(...new Set(arr)) // Array.of根据传入的参数生成数组

方法二:

var arr = ['apple','apps','pear','apple','orange','apps'];  
var newArr = arr.filter(function(item,index){return arr.indexOf(item) === index;  // 因为indexOf 只能查找到第一个  
});

方法三:

some + 循环去重

function distinct(list) {let result = [list[0]];// 用于承接没有重复的数据,初始时将原始数组的第一个值赋给它。for (let i = 1; i < list.length; i++) {// 判断结果数组中是否存在一样的值,若果没有的话则将数据存入结果数组中。if (!(result.some(val => list[i] === val))) {result.push(list[i]);}}return result;}

方法四:

如果不能用ES6、5的语法。需要原生方法双重for循环去重:

function noRepeat(arr) {for(var i = 0; i < arr.length-1; i++){for(var j = i+1; j < arr.length; j++){if(arr[i]===arr[j]){arr.splice(j,1);j--;}}}return arr;}

方法五:

简单数组用includes去重

function noRepeat(arr) {let newArr = [];for(i=0; i<arr.length; i++){if(!newArr.includes(arr[i])){newArr.push(arr[i])}}return newArr
}

附录 -Set

使用 new 关键字和 Set 构造函数可以创建一个空集合:

const s = new Set();

如果想在创建的同时初始化实例,则可以给 Set 构造函数传入一个可迭代对象(Array Map Set WeakMap WeakSet)。可迭代对象需要包含插入到新集合实例中的元素(Set 可以包含任何 JavaScript 数据类型作为值)。Set构造函数会迭代传入参数,去重后保存到集合实例中。

特点

  1. Set 是唯一值的集合。

  1. 每个值在 Set 中只能出现一次。

  1. 一个 Set 可以容纳任何数据类型的任何值。

你可以把Set想像成跟数组一样,我们用size来输出Set集合的长度。

const s = new Set(['a','b','c','c']);
s.size; // 3 去重了一个c
const s2 = new Set();
s2.add('a')
s2.add('b')
s2.add('c')
s2.size // 3

与Array的区别

最根本的区别是数组是一个索引集合,这说明数组中的数据值按索引排序。

相比之下,set是一个键的集合。set不使用索引,而是使用键对数据排序(看下面forEach)。set 中的元素按插入顺序是可迭代的,它不能包含任何重复的数据。

对比Array的优势

在运行时间方面上Set占了很大的优势

  • 查看元素:使用indexOf()或includes()检查数组中的项是否存在是比较慢的。

  • 删除元素:在Set中,可以根据每项的的 value 来删除该项。在数组中,等价的方法是使用基于元素的索引的splice()。与前一点一样,依赖于索引的速度很慢。

  • 保存 NaN:不能使用indexOf()或 includes() 来查找值 NaN,而 Set 可以保存此值。

  • 删除重复项:Set对象只存储惟一的值,如果不想有重复项存在,相对于数组的一个显著优势,因为数组需要额外的代码来处理重复。

时间复杂度:
数组用来搜索元素的方法时间复杂度为0(N)。换句话说,运行时间的增长速度与数据大小的增长速度相同。
相比之下,Set用于搜索、删除和插入元素的方法的时间复杂度都只有O(1),这意味着数据的大小实际上与这些方法的运行时间无关。

具体解释与面试题强烈推荐阅读如何使用 Set 来提高JS代码的性能 - 知乎 (zhihu.com)

其他API

has()

查询Set实例是否存在某元素(返回布尔值):

const s = new Set();
s.add(1).add(2).add(3);
s.has(1); // true
delete()

删除某个元素

s.delete(1);
clear()

清空Set实例

s.clear();
Array.from(s); // []

迭代:

for of

for in不输出,因为它不是以下标为索引的集合

const s = new Set(['a','b','c','c']);
for (var n of s) {console.log(n)}
// a
// b
// c
forEach
s.forEach((t,i)=>console.log(t,i))
// a a
// b b
// c c
// 输出了键值对的结构
原生属性

可以看见Set实例的三个属性返回了枚举的类数组。

直接用Array.form转换

Array.from(s.keys())
// ['a', 'b', 'c']
Array.from(s.entries())
// [['a', 'a'],['b', 'b'],['c', 'c']]
Array.from(s.values())
// ['a', 'b', 'c']

附录-面试题

题目:

给定一个整数无序数组和变量 sum,如果存在数组中任意两项和使等于 sum 的值,则返回true。否则,返回false。例如,数组[3,5,1,4]和 sum = 9,函数应该返回true,因为4 + 5 = 9。

解题思路:

本题其实是为了找数组元素与sum的差值是否在数组里重复出现。

const s = new Set()
arr.some(t=> {if (s.has(t)) {return true}s.add(sum-t);return fasle
})

简洁点写:

const findSum = (arr, sum) =>arr.some((set => n => set.has(n) || !set.add(sum - n))(new Set));

相关文章:

JS中数组如何去重(ES6新增的Set集合类型)+经典two sum面试题

现在有这么一个重复数组&#xff1a;const arr [a,a,b,a,b,c]只推荐简单高效的方法&#xff0c;复杂繁琐的方法不做推荐方法一&#xff1a;const res [...new Set(arr)]Set类型是什么呢&#xff1f;Set 是ES6新增的一种新集合类型。具体知识点可以看下面附录&#xff1a;根据…...

HDLC简介及相应hdlc实训

HDLC简介 HDLC 协议 高级数据链路控制&#xff08;HDLC&#xff0c;High-level Data Link Control&#xff09;是一种面向比特的链路层协议&#xff0c; 其最大特点是对任何一种比特流&#xff0c;均可以实现透明的传输。HDLC协议具有以下优点。 透明传输&#xff1a;HDLC不…...

公司技术团队为什么选择使用 YApi 作为 Api 管理平台?

在 2021 年 12 月份的时候我就推荐过一款软件程序员软件推荐&#xff1a;Apifox&#xff0c;当时体验了一下里面的功能确实很实用&#xff0c;但是当时公司有一套自己的 API 管理方案&#xff0c;所有 Apifox 暂时就没在内部使用。 直到最近要使用其他的 API 管理方案的时候才…...

ts知识点整理

1、ts 中的 any 和 unknown 有什么区别&#xff1f; any 和 unknown 都是顶级类型&#xff0c;但是 unknown 更加严格&#xff0c;不像 any 那样不做类型检查&#xff0c;反而 unknown 因为未知性质&#xff0c;不允许访问属性&#xff0c;不允许赋值给其他有明确类型的变量。…...

技术分享 | OceanBase 数据处理之控制文件

作者&#xff1a;杨文 DBA&#xff0c;负责客户项目的需求与维护&#xff0c;会点数据库&#xff0c;不限于MySQL、Redis、Cassandra、GreenPlum、ClickHouse、Elastic、TDSQL等等。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用…...

TCP的三次握手、四次挥手

文章目录前言一、一些重要字段的含义二、TCP总括图三、三次握手详细过程1.第一次握手2.第二次握手3.第三次握手三次握手小结4.为什么必须要进行三次握手&#xff0c;两次或四次就不行四、四次挥手1.第一次挥手2.第二次挥手3.第三次挥手4.第四次挥手四次挥手简述前言 一个TCP的…...

C++---特殊类的设计

文章目录前言一、请设计一个类,不能被拷贝二、请设计一个类,只能在堆上创建对象三、请设计一个类,只能在栈上创建对象四、请设计一个类,不能被继承五、请设计一个类&#xff0c;只能创建一个对象(单例模式)总结前言 正文开始! 一、请设计一个类,不能被拷贝 拷贝只会发生在两个…...

buu [WUSTCTF2020]dp_leaking_1s_very_d@angerous 1

题目描述&#xff1a; e 65537 n 1568083435985787749573756968151889806821667406093028310996964920682463371987925108988184962391663390152073051021014316342831685444929845865667999964711502523821441482572367072472675061656708775063702531276953141639870840764…...

基于SVPWM改进的永磁同步电机直接转矩控制二更

导读&#xff1a;本期对基于SVPWM的永磁同步电机直接转矩控制进行全面的分析和仿真搭建。之后与传统的DTC进行比较&#xff0c;凸显基于SVPWM改进的DTC方法的有效性。如果需要文中的仿真模型&#xff0c;关注微信公众号&#xff1a;浅谈电机控制&#xff0c;留言获取。一、 传统…...

ubuntu下磁盘管理

一. ubuntu 磁盘文件 在做 Linux 嵌入式开发中&#xff0c;一般选择 U 盘的要求是&#xff1a;确保 U 盘是 FAT格式&#xff0c;即选用 FAT32 格式的U盘或 SD 卡。不要用 NTFS 格式的 U 盘或 SD卡&#xff0c;因为Linux 大多数系统都不支持 NTFS格式的&#xff0c;NTFS 格式的…...

Python学习-----排序问题1.0(冒泡排序、选择排序、插入排序)

目录 前言&#xff1a; 1.冒泡排序 2.选择排序 3.插入排序 前言&#xff1a; 学过C语言肯定接触过排序问题&#xff0c;我们最常用的也就是冒泡排序、选择排序、插入排序……等等&#xff0c;同样在Python中也有排序问题&#xff0c;这里我也会讲解Python中冒泡排序、选择排…...

LeetCode 535. TinyURL 的加密与解密

TinyURL 是一种 URL 简化服务&#xff0c; 比如&#xff1a;当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时&#xff0c;它将返回一个简化的URL http://tinyurl.com/4e9iAk 。请你设计一个类来加密与解密 TinyURL 。 加密和解密算法如何设计和运作是没有限…...

【c++】类和对象2—构造函数、析构函数、拷贝构造函数

文章目录构造函数和析构函数构造函数的分类及调用拷贝构造函数调用时机构造函数调用规则深拷贝与浅拷贝构造函数和析构函数 c利用了构造函数和析构函数解决上述问题&#xff0c;这两个函数将会被编译器自动调用&#xff0c;完成对象初始化和清理工作。对象的初始化和清理工作是…...

[C++关键字] const/constexpr

文章目录const/constexpr[^1]const 与 宏const 与 类const 与 指针const 其他constexpr (C11之后)referenceconst/constexpr1 尽可能的使用constexpr对于不变的变量&#xff0c;尽量用const修饰 const 与 宏 const vs define的比较&#xff1a;define只是字符的替换&#xf…...

FPGA电源电流参数

一、FPGA里各个电源释义 VCCINT VCCINT是FPGA芯片的内核电压&#xff0c;是用来给FPGA内部的逻辑门和触发器上的电压。即芯片的晶体管开关是有核心电压提供。当内部逻辑工作时钟速率越高&#xff0c;使用逻辑资源越多&#xff0c;则核心电压供电电流会更大&#xff0c;可高达几…...

【Git】Git下载安装与使用(一)

目录 1. 前言 1.1 什么是Git 1.2 使用Git能做什么 2. Git概述 2.1 Git简介 2.2 Git下载与安装 3. Git代码托管服务 3.1 常用的Git代码托管服务 3.2 码云代码托管服务 1. 前言 1.1 什么是Git Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码…...

刷题记录:牛客NC20545[HEOI2012]采花

传送门:牛客 题目描述: 题目较长,此处暂略 输入: 5 3 5 1 2 2 3 1 1 5 1 2 2 2 2 3 3 5 输出: 2 0 0 1 0总结一下题意,就是求区间[l,r][l,r][l,r]出现次数大于1的花的种类数. 考虑使用主席树或者离线树状数组的方法来解决.由于数据加强的原因,导致主席树在本题中是不能完美通…...

每日学术速递2.21

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.T2I-Adapter: Learning Adapters to Dig out More Controllable Ability for Text-to-Image Diffusion Models 标题&#xff1a;T2I-Adapter&#xff1a;学习Adapter&#xff0c;为…...

网络安全之认识挖矿木马

一、什么是挖矿木马&#xff1f; 比特币是以区块链技术为基础的虚拟加密货币&#xff0c;比特币具有匿名性和难以追踪的特点&#xff0c;经过十余年的发展&#xff0c;已成为网络黑产最爱使用的交易媒介。大多数勒索病毒在加密受害者数据后&#xff0c;会勒索代价高昂的比特币…...

OpenCV实战——基于分水岭算法的图像分割

OpenCV实战——基于分水岭算法的图像分割0. 前言1. 分水岭算法2. 分水岭算法直观理解3. 完整代码相关链接0. 前言 分水岭变换是一种流行的图像处理算法&#xff0c;用于快速将图像分割成同质区域。分水岭变换主要基于以下思想&#xff1a;当图像被视为拓扑浮雕时&#xff0c;均…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中&#xff0c;我们经常会遇到这样的场景&#xff1a;一个对象的状态变化需要自动通知其他对象&#xff0c;比如&#xff1a; 电商平台中&#xff0c;商品库存变化时需要通知所有订阅该商品的用户&#xff1b;新闻网站中&#xff0…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...