不是,你不会还在用双层遍历循环来做新旧数组对比,寻找新增元素吧?

目录

一、双层循环遍历

1.1、双循环错误示范

1.2、正确的做法

①使用array.includes()

②使用set

二、array.includes()的使用与技巧

2.1、基本语法

2.2、返回值

2.3、使用技巧

2.3.1、用户输入验证

2.3.2、权限检查

2.4、兼容问题

三、总结


一、双层循环遍历

1.1、双循环错误示范

        前几天看项目,发现有个新旧数组对比,寻找新增元素的需求竟然是用for写的双循环。大概就像下面这样:

// 假设这是两个数组的真实数据
const array1 = [1, 2, 3, 4, 5, 6, 7, 8];
const array2 = [4, 5, 6, 7, 8];// 用来存储不重复的元素
const uniqueElements = [];// 双重循环遍历两个数组
for (let i = 0; i < array1.length; i++) {for (let j = 0; j < array2.length; j++) {// 检查array1中的元素是否不在array2中if (array1[i] !== array2[j]) {uniqueElements.push(array1[i]);}}
}// 打印不重复的元素
console.log(uniqueElements);

        太抽象了,这样代码的?给我一种21世纪用木头刀枪打猎的感觉。还有的是这样写的:

// 假设这是两个数组的真实数据
const array1 = [1, 2, 3, 4, 5, 6, 7, 8];
const array2 = [4, 5, 6, 7, 8];// 用来存储不重复的元素
let uniqueElements = [];// 遍历array1中的每个元素
array1.forEach(item1 => {// 用另一个forEach来检查array1中的元素是否不在array2中let isUnique = array2.forEach((item2, index, array) => {return item1 === item2;});// 如果isUnique为false,说明item1不在array2中if (!isUnique) {uniqueElements.push(item1);}
});// 打印不重复的元素
console.log(uniqueElements); // 输出: [1, 2, 3]

        可是有什么区别吗?forEach看起来是高级一点,但是没有摆脱最基础的逻辑啊,重点是双循环很干,一点都不巧妙。基本的逻辑就是在满足功能、需求和时间效率的基础上,要尽可能少用循环,少用回调,大幅提高代码的可读性和可维护性。

1.2、正确的做法

①使用array.includes()

        最基本的就是要会用array.includes()方法,可以少一次循环。

        在这段代码中,我们使用 forEach 方法遍历 array1 中的每个元素。对于 array1 中的每个元素 item1,我们使用 includes 方法检查它是否不在 array2 中。如果 item1 不在 array2 中,我们就将它添加到 uniqueElements 数组中。最后,我们打印出 uniqueElements 数组,它包含了 array1 中不在 array2 中的所有元素。

// 假设这是两个数组的真实数据
const array1 = [1, 2, 3, 4, 5, 6, 7, 8];
const array2 = [4, 5, 6, 7, 8];// 用来存储不重复的元素
let uniqueElements = [];// 遍历array1中的每个元素
array1.forEach(item1 => {// 检查array1中的元素是否不在array2中if (!array2.includes(item1)) {uniqueElements.push(item1);}
});// 打印不重复的元素
console.log(uniqueElements); // 输出: [1, 2, 3]

②使用set

        使用集合先去重,然后通过Set.has()方法来判断新增元素。

        在这个代码中,我们首先创建了一个 Set 对象 set2 来存储 array2 中的所有元素。然后,我们使用 forEach 方法遍历 array1 中的每个元素 item1。对于 array1 中的每个元素,我们检查它是否不在 set2 中。如果不在,我们将其添加到 uniqueElements 数组中。最后,我们打印出 uniqueElements 数组,它包含了 array1 中不在 array2 中的所有元素。

// 假设这是两个数组的真实数据
const array1 = [1, 2, 3, 4, 5, 6, 7, 8];
const array2 = [4, 5, 6, 7, 8];// 创建一个集合来存储array2中的元素,以便快速查找
const set2 = new Set(array2);// 用来存储不重复的元素
const uniqueElements = [];array1.forEach(item1 => {// 检查item1是否不在array2的集合中if (!set2.has(item1)) {uniqueElements.push(item1);}
});// 打印不重复的元素
console.log(uniqueElements); // 应该输出: [1, 2, 3]

        这样是不是优雅很多?并且时间效率上也有提高。

        既然谈到这里,就简单聊一下array.includes()吧。

二、array.includes()的使用与技巧

2.1、基本语法

arr.includes(searchElement[, fromIndex])

  • searchElement:需要检查是否包含在数组中的元素。
  • fromIndex(可选):开始搜索的索引位置,默认值为 0。如果该值大于数组长度,则返回 false 并且不执行搜索。

2.2、返回值

  • 如果 searchElement 存在于数组中,返回 true。
  • 如果 searchElement 不存在于数组中,返回 false。

2.3、使用技巧

        array.includes()用于判断一个数组是否包含一个指定的值,根据情况返回 truefalse

2.3.1、用户输入验证

        在表单验证中,我们可能需要检查用户输入是否包含某些特定的字符或单词。

const userInput = "Hello, World!";
const bannedWords = ["badword", "offensiveword"];if (bannedWords.some(word => userInput.includes(word))) {console.log("输入包含禁止词汇!");
} else {console.log("输入有效。");
}

2.3.2、权限检查

        在权限管理系统中,includes() 可以用来检查用户是否具有执行特定操作的权限。

const userPermissions = ["read", "write", "delete"];
const requiredPermission = "delete";if (userPermissions.includes(requiredPermission)) {console.log("用户有权限执行删除操作。");
} else {console.log("用户没有权限执行删除操作。");
}

2.4、兼容问题

        array.includes() 方法在现代浏览器中得到广泛支持,包括最新版本的 Chrome、Firefox、Safari、Edge 和 Opera。对于不支持 includes() 的旧浏览器,可以使用 Array.prototype.indexOf() 方法作为替代:

if (!Array.prototype.includes) {Array.prototype.includes = function(searchElement /*, fromIndex*/){'use strict';var O = Object(this);var len = parseInt(O.length, 10) || 0;if (len === 0) {return false;}var fromIndex = !fromIndex || fromIndex < 0 ? 0 : Math.floor(fromIndex);for (; fromIndex < len; fromIndex++) {if (fromIndex in O && O[fromIndex] === searchElement) {return true;}}return false;};
}

三、总结

        这类问题的重点在于能不能突破基础思路,突破基础思路是从程序员入门变成中级甚至高级的第一步,如果所有需求都通过最基础的业务逻辑来做,是得不到成长的。

        丰富的前端内容请看:各种前端问题的技巧和解决方案

        博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

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

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

相关文章

OpenCV学习 基础图像操作(十六):图像距离变换

基础原理 顾名思义&#xff0c;我们可以利用像素之间的距离作为对该像素的一种刻画&#xff0c;并将其运用到相应的计算之中。然而&#xff0c;在一幅图像之中&#xff0c;某种类型的像素并不是唯一的&#xff0c;因此我门常计算的是一类像素到另一类的最小距离&#xff0c;并…

香橙派KunPengPro评测

一、引言 二、开箱 2.1、主要包含说明 1、充电器(赠typec-c线) 2、香橙派kunpengpro(已经带装好带散热器) 3、SD卡(32G)(已经带装好系统openEuler 22.03 (LTS-SP3)) (注意&#xff1a;上电接HDMI线可直接用&#xff0c;账号&#xff1a;openEuler 密码&#xff1a;openEuler)…

vue使用tailwindcss

安装依赖 pnpm add -D tailwindcss postcss autoprefixer创建配置文件tailwind.config.js npx tailwindcss init在配置文件content中添加所有模板文件的路径 /** type {import(tailwindcss).Config} */ export default {content: [./index.html, ./src/**/*.{vue,js,ts,jsx,…

【Linux】开发工具入门指南,轻松掌握你的开发利器

开发工具 1. 软件包管理器yum1.1 软件包安装方式1.2 yum的"三板斧"1.3 yum的周边 2. 开发工具3. 编辑器vim4. 编译器gcc、g5. 项目自动化构建工具make、Makefile6. 进度条小程序7. 调试器gdb 1. 软件包管理器yum 1.1 软件包安装方式 源代码安装&#xff1a;用户手动…

微信小程序 npm构建+vant-weaap安装

微信小程序&#xff1a;工具-npm构建 报错 解决&#xff1a; 1、新建miniprogram文件后&#xff0c;直接进入到miniprogram目录&#xff0c;再次执行下面两个命令&#xff0c;然后再构建npm成功 npm init -y npm install express&#xff08;Node js后端Express开发&#xff…

智慧校园的机遇与挑战

随着5G、物联网、大数据等技能的日渐老练&#xff0c;数字化正在渗透到各行各业中&#xff0c;为事务立异和价值增加供给支撑。在教育职业&#xff0c;运用智能化体系赋能教育办理越来越受欢迎&#xff0c;教育信息化方针一再出台&#xff0c;进一步加快了智慧校园落地的脚步。…

Linux - 文件管理高级 sed

3.处理字符 sed ① sed 默认情况下不会修改原文件内容 ② sed 是一种非交互式的编辑器 3.1 工作原理 将原文件一行一行的进行处理&#xff0c;取出一行&#xff0c;放入“模式空间进行处理”&#xff0c;处理完成之后将结果输出到屏幕上&#xff0c;然后读取下一行&#xf…

彭涛 | 2024年5月小结

5月份还是蛮有刺激的&#xff0c;做了蛮多的事情&#xff0c;但是没赚到钱&#xff0c;真是一屯操作猛如虎&#xff0c;一看账户0.5。 就喜欢创业这种一天天累死累活还不赚钱的感觉&#xff0c;哈哈哈哈 老规矩简单说下这个月的情况&#xff0c;如果对你有收获就最好了。 游学丹…

【Tlias智能学习辅助系统】04 部门管理 删除 和 新增

Tlias智能学习辅助系统 04 部门管理 删除 和 新增 删除部门APIDeptController.javaDeptService.javaDeptServiceImpl.javaDeptMapper.java前端联调 新增部门API有一步简化DeptController.javaDeptService.javaDeptServiceImpl.javaDeptMapper.java前端联调 删除部门API 请求路径…

Selenium+Java 环境搭建

selenium 介绍 Selenium 是 web 应用中基于 UI 的自动化测试框架&#xff0c;支持多平台、多浏览器、多语言。 早期的 selenium RC 已经被现在的 webDriver 所替代&#xff0c;可以简单的理解为selenium1.0webdriver 构成 现在的 Selenium2.0 。现在我们说起 selenium &#xf…

适合学生写作业的台灯有哪些?台灯怎么选详细攻略!

在数字化飞速发展的今天&#xff0c;孩子们的学习和生活越来越离不开电子屏幕。然而&#xff0c;长时间盯着屏幕&#xff0c;不仅容易让眼睛感到疲劳&#xff0c;更是近视问题日益严重的元凶之一。每一位家长都希望孩子能拥有健康的视力&#xff0c;因此会为孩子挑选一台护眼灯…

MySQL十部曲之九:MySQL优化理论

文章目录 前言概述查询优化查询执行计划EXPLAIN获取表结构信息获取执行计划信息 EXPLAIN 输出格式如何使用EXPLAIN进行优化 范围访问优化单列索引的范围访问多列索引的范围访问 索引合并优化索引合并交叉访问算法索引合并联合访问算法索引合并排序联合访问算法 索引下推优化连接…

豆包浏览器插件会造成code标签内容无法正常显示

启用状态&#xff1a;页面的代码会显示不正常 禁用后&#xff0c;正常显示 害得我重置浏览器设置&#xff0c;一个个测试

spring mvc 中怎样定位到请求调用的controller

前言 在java web开发过程中&#xff0c;正常情况下controller都是我们自己写的&#xff0c;我们可以很方便的定位到controller的位置。但是有些时候我们引入的其他依赖中可能也有controller&#xff0c;为了找到并方便的调试jar包中的controller&#xff0c;我们一般会进行全局…

【CPP】双端队列简介(deque)

简介&#xff1a;双端队列(deque) 目录 1.概述2.特点3.底层原理 1.概述 双端队列&#xff1a;是一种顺序表和顺序表的结合数据结构&#xff0c;不是队列。 它提供顺序表的[]下标访问和链表的中间头部的较高效率插入删除操作。 2.特点 顺序表的优缺点&#xff1a; 优点&…

linux之docker- image.tar 的导出和导入

一、情况 docker 镜像有时无法从外网访问&#xff0c;需要把docker 打包导出到本地&#xff0c;然后以文件的形式&#xff0c;发送给其他人&#xff0c;再然后其他人把docker 镜像文件导入到自己的服务器本地镜像仓库&#xff0c;方可使用。也可把镜像上传到公司内网。下面就开…

Verilog HDL基础知识(二)

引言&#xff1a;本文继续介绍Verilog HDL基础知识&#xff0c;重点介绍赋值语句、阻塞与非阻塞、循环语句、同步与异步、函数与任务语法知识。 1. 赋值语句 在Verilog中&#xff0c;有两种进行赋值的方法&#xff0c;即连续赋值语句和过程赋值语句&#xff08;块&#xff09…

Java数据结构-二叉搜索树

目录 1. 概念2. 二叉搜索树的操作2.1 查找2.2 插入2.3 删除 3. 全部代码 1. 概念 二叉搜索树是特殊的二叉树,也叫二叉排序树,它的特点是:每个结点的左子树上的所有结点的值都小于这个结点的值,右子树上的所有结点的值都大于这个结点的值,另外所有的左子树和右子树也分别为二叉…

详解 Spark 编程之 RDD 依赖关系

一、依赖与血缘关系 依赖&#xff1a;两个相邻 RDD 之间的关系血缘关系&#xff1a;多个连续的 RDD 的依赖由于 RDD 不会保存数据&#xff0c;为了提高容错性&#xff0c;每个 RDD 都会保存自己的血缘关系&#xff0c;一旦某个转换过程出现错误&#xff0c;可以根据血缘关系重新…

随身wifi网络卡顿怎么解决?随身WiFi哪个牌子的最好用?排名第一名的随身WiFi!

对于随身wifi靠不靠谱这个问题&#xff0c;网上一直存在争议。很多人的随身wifi网速不稳定&#xff0c;信号看着满格就是上不了网。关于随身wifi卡顿到底该怎么解决呢&#xff1f; 1.如果是设备网络在一个地方上网速度很快&#xff0c;换一个地方网络就不行了&#xff0c;很可能…