TypeScript: 判断两个数组的内容是否相等
一、直接遍历
// 1.直接遍历
const arr1: any[] = ["apple", "banana", NaN];
const arr2: any[] = ["apple", NaN, "banana"];function fn1(arr1: any[], arr2: any[]) {// Array.some(): 有一项不满足,返回falseif (arr1.length !== arr2.length) {return false;}return arr1.some((item: any) => arr2.indexOf(item) === -1) ? false : true;
// return !arr1.some((item) => !arr2.includes(item));
}
console.log("直接遍历 => ", fn1(arr1, arr2)); // false
NaN 会有问题
优化版本
// 1.直接遍历
const arr1: any[] = ["apple", "banana", NaN];
const arr2: any[] = ["apple", NaN, "banana"];function fn1(arr1: any[], arr2: any[]) {// Array.some(): 有一项不满足,返回falseif (arr1.length !== arr2.length) {return false;}
// return arr1.some((item: any) => arr2.indexOf(item) === -1) ? false : true;return !arr1.some((item) => !arr2.includes(item));
}
console.log("直接遍历 => ", fn1(arr1, arr2)); // true
Array.prototype.indexOf() 是使用的严格相等算法 => NaN值永远不相等
Array.prototype.includes() 是使用的零值相等算法 => NaN值视作相等
二、把重复元素编号
// 2.把重复元素标识编号
function fn3(arr1: any[], arr2: any[]) {if (arr1.length !== arr2.length) {return false;}// 重复数组元素 加1、2、3const countArr1 = updateArray(arr1);const countArr2 = updateArray(arr2);// arr 数组 元素重复转换成 val1,val2function updateArray(arr: any[]) {const countMap: Map<any, number> = new Map();const updateArr: any[] = [];for (const ele of arr) {// const cnt = !countMap.has(ele) ? 1 : countMap.get(ele)! + 1;const cnt = (countMap.get(ele) || 0) + 1;countMap.set(ele, cnt);updateArr.push(`${ele}${cnt}`); // 有问题// 等同于// if (!countMap.has(ele)) {// // 如果元素是第一次出现,直接添加到结果数组// countMap.set(ele, 0)// updateArr.push(ele)// } else {// // 如果元素已经出现过,添加带有编号的新元素到结果数组// const count = countMap.get(ele)! + 1// countMap.set(ele, count)// updateArr.push(`${ele}${count}`)// }}return updateArr;}// console.log("countArr1 => ", countArr1);// console.log("countArr2 => ", countArr2)return !countArr1.some((item) => !countArr2.includes(item));
}const array1 = ["apple", "banana", "cherry", "banana"];
const array2 = ["banana", "apple", "banana", "cherry"];
console.log("把重复元素标识编号 => ", fn3(array1, array2)); // true// 其实这种存在漏洞的
const array3 = ["apple", "banana", "cherry", "banana", 1, "1", "1"];
const array4 = ["banana", "apple", "banana", "cherry", "1", 1, 1];
// 应该是false
console.log("把重复元素标识编号 存在漏洞 => ", fn3(array3, array4)); // true
三、统计元素次数
// 3.统计元素次数
function fn4(arr1: any[], arr2: any[]) {if (arr1.length !== arr2.length) {return false;}// 创建计数对象,用于记录每个元素在数组中的出现次数const countMap1: Map<any, number> = count(arr1);const countMap2: Map<any, number> = count(arr2);function count(arr: any[] = []) {const map: Map<any, number> = new Map();for (const item of arr) {map.set(item, (map.get(item) || 0) + 1);}return map;}//检查计数对象是否相等// console.log("countMap1 => ", countMap1)
// console.log("countMap2 => ", countMap2)for (const [key, count] of countMap1) {if (countMap2.get(key) !== count) {return false;}}return true;
}const array5 = ["apple", "banana", "cherry", "banana", 1, "1", "11", 11];
const array6 = ["banana", "apple", "banana", "cherry", "1", 1, "11", 11];console.log("统计元素次数 => ", fn4(array5, array6)); // true
console.log("统计元素次数 => ", fn4(array3, array4)); // false
四、+1,-1
// 4.+1,-1
function fn5(arr1: any[], arr2: any[]) {if (arr1.length !== arr2.length) {return false;}const countMap: Map<any, number> = new Map();// 计算第一个数组的元素for (const item of arr1) {countMap.set(item, (countMap.get(item) || 0) + 1);}// 比较第二个数组for (const item of arr2) {const val = countMap.get(item)if (val === undefined || val <= 0) {return false;}countMap.set(item, val - 1)}return true;
}
console.log("+1, -1 => ", fn5(array3, array4)) // false
console.log("+1, -1 => ", fn5(array5, array6)) // true
总结
- 先判断长度,长度不等,必然不等
- 元素可重复
- 边界情况考虑
- ‘1’ 和 1 (Object的key是字符串,Map的key没有限制)
- NaN
- null、undefined
相关知识
JS规范中的相等、严格相等、零值相等以及同值相等
- 非严格相等比较:==
- 严格相等比较:===(用于Array.prototype.indexOf(),Array.prototype.lastIndexOf(),case-matching)
- 零值相等:用于%TypeArray%和ArrayBuffer构造函数、Map和Set操作、String.prototype.inclues()
- 同值相等:用于所有其他地方
零值相等:与同值相等类似,不过+0 与-0 相等
同值相等:确定两个值是否在任何情况次啊功能上是相同的
相关文章:
TypeScript: 判断两个数组的内容是否相等
一、直接遍历 // 1.直接遍历 const arr1: any[] ["apple", "banana", NaN]; const arr2: any[] ["apple", NaN, "banana"];function fn1(arr1: any[], arr2: any[]) {// Array.some(): 有一项不满足,返回falseif (arr1.…...
STM32MPU6050角度的读取(STM32驱动MPU6050)
注:文末附STM32驱动MPU6050代码工程链接,需要的读者请自取。 一、MPU6050介绍 MPU6050是一款集成了三轴陀螺仪和三轴加速度计的传感器芯片,由英国飞利浦半导体(现为恩智浦半导体)公司生产。它通过电子接口(…...
海康Visionmaster-环境配置:CSharp 二次开发环境配 置方法
C#二次开发环境的配置方法 以 WinForm 为例,进行 VM 二次开发的环境配置分为三步: 第一步,使用 VS 新建一个框架为.NET Framework 4.6.1 的工程,平台首选 32 位取消勾选,重新生成解决方案,保证工程 Debug 下…...
Xilinx DDR3 MIG系列——ddr3控制器的时钟架构
本节目录 一、ddr3控制器的时钟架构 1、PLL输入时钟——系统时钟system_clk 2、PLL输出时钟——sync_pulse、mem_refclk、freq_refclk、MMCM1的输入时钟 3、MMCM1的输入时钟和输出时钟 4、MMCM2的输入时钟和输出时钟一、ddr3控制器的时钟架构 对于FPGA开发来说,调用IP或者移植…...
2560 动物保护宣传网站设计JSP【程序源码+文档+调试运行】
摘要 本文介绍了一个动物保护宣传网站的系统的设计与实现。该系统包括前台用户模块和后台管理员模块,具有用户注册/登录、新闻、资源库、法律法规、图片赏析、留言板、关于我们、用户后台等功能。通过数据库设计和界面设计,实现了系统的基本功能&#x…...
【算法】牛的旅行(图的直径,floyd算法求最短路)
题目 农民John的农场里有很多牧区,有的路径连接一些特定的牧区。 一片所有连通的牧区称为一个牧场。 但是就目前而言,你能看到至少有两个牧区不连通。 现在,John想在农场里添加一条路径(注意,恰好一条)。 一…...
QML12、QML 对象类型
QML 对象类型 QML 对象类型是可以从中实例化 QML 对象的类型。 在句法术语中,QML 对象类型是一种可用于通过指定类型名称后跟一组包含该对象属性的花括号来声明对象的类型。 这与基本类型不同,基本类型不能以相同的方式使用。 例如,Rectangle 是一个 QML 对象类型:…...
JavaWeb Day08 Mybatis-入门
目录 编辑编辑编辑 一、快速入门程序 ①准备工作 ②引入Mybatis相关依赖,配置Mybatis ③编写SQL(注解/XML) ④单元测试 ⑤相关代码 1.pom.xml 2. application.properties 3.User.java 4. UserMapper.java 5.Test.java ⑥配置…...
【计算机网络笔记】IP分片
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...
GPT 写作与改编
GPT 写作与改编 文商科GPT 写作收益 改编技巧【改编一段话】【改编评价】【意识预设】落差,让顾客看到就感性和冲动害怕,让顾客看到就想买和拥有画面,切换空间,瞬间代入,勾人魂魄对比,设置参考物࿰…...
探秘OpenCV中的findContours函数
文章目录 导言findContours函数的作用函数原型原理分析 应用场景代码示例结语 导言 在计算机视觉领域,图像处理是一项重要的任务。而在图像处理的过程中,轮廓(Contours)的提取是一项基础且关键的操作。OpenCV库中的findContours函…...
iOS 17.2更新:15Pro支持拍摄空间视频!
苹果又为开发者预览版用户推送了iOS 17.2 Beta2测试版的更新,已经注册Apple Beta版软件计划的用户只需打开设置--通用--软件更新即可在线OTA升级至最新的iOS 17.2测试版。 本次更新包大小为750M左右,内部版本号为(21C5040g)&#…...
keep-alive缓存,三级路由不生效
此文章讲诉在vue中使用keep-alive缓存,三级路由缓存失败处理方案。 一二级路由缓存无任何问题,三级以上就会失败,因此我们在路由守卫中对matched做出如下优化 Router.beforeEach((to, from, next)>{if(to.matched && to.matched.l…...
从Hadoop到对象存储,抛弃Hadoop,数据湖才能重获新生?
Hadoop与数据湖的关系 1、Hadoop时代的落幕2、Databricks和Snowflake做对了什么3、Hadoop与对象存储(OSD)4、Databricks与Snowflake为什么选择对象存储5、对象存储面临的挑战 1、Hadoop时代的落幕 十几年前,Hadoop是解决大规模数据分析的“白…...
电脑小Tip---外接键盘F1-F12快捷键与笔记本不同步
当笔记本外接一款非常好用的静音键盘后,会出现一些问题。例如:外接键盘F1-F12与笔记本不同步。具体一个例子就是,在运行matlab程序时,需要点编辑器—运行,这样就很麻烦,直接运行的快捷键是笔记本键盘上的F5…...
跨域:利用CORS实现跨域访问
跨域知识点:跨域知识点 iframe实现跨域的四种方式:iframe实现跨域 JSONP和WebSocket实现跨域:jsonp和websocket实现跨域 目录 cors介绍 简介 两种请求 简单请求 基本流程 withCredentials 属性 非简单请求 预检请求 预检请求的回应 …...
【Linux】Centos7 shell实现MySQL5.7 tar 一键安装
🦄 个人主页——🎐个人主页 🎐✨🍁 🪁🍁🪁🍁🪁🍁🪁🍁 感谢点赞和关注 ,每天进步一点点!加油!&…...
一步一步详细介绍如何使用 OpenCV 制作低成本立体相机
在这篇文章中,我们将学习如何创建定制的低成本立体相机(使用一对网络摄像头)并使用 OpenCV 捕获 3D 视频。我们提供 Python 和 C++ 代码。文末并附完整的免费代码下载链接 我们都喜欢观看上面所示的 3D 电影和视频。您需要如图 1 所示的红青色 3D 眼镜才能体验 3D 效果。它是…...
Zookeeper篇---第四篇
系列文章目录 文章目录 系列文章目录一、ZooKeeper 集群中个服务器之间是怎样通信的?二、ZooKeeper 分布式锁怎么实现的?三、了解Zookeeper的系统架构吗?一、ZooKeeper 集群中个服务器之间是怎样通信的? Leader 服务器会和每一个 Follower/Observer 服务器都建立 TCP 连接…...
Seata之TCC模式解读
目录 基本介绍 起源 概述 案例流程分析 TCC注意事项 空回滚 幂等 悬挂 具体使用 LocalTCC TwoPhaseBusinessAction 小结 基本介绍 起源 关于TCC的概念,最早是由Pat Helland于2007年发表的一篇名为《Life beyond Distributed Transactions:an Apost…...
一个简洁易用的 Delphi JSON 封装库,基于 System.JSON`单元封装,提供更直观的 API廖
一、前言:什么是 OFA VQA 模型? OFA(One For All)是字节跳动提出的多模态预训练模型,支持视觉问答、图像描述、图像编辑等多种任务,其中视觉问答(VQA)是最常用的功能之一——输入一张…...
Replit AI 零基础编程使用教程:从 0 到 1 玩转 AI 辅助开发
前言 还在为搭建开发环境头疼?还在因为编程基础薄弱写不出代码?Replit AI 作为一款浏览器原生、零配置、AI 驱动的全栈开发平台,完美解决了这些问题。它能让你从一个简单的想法出发,通过自然语言对话,快速生成、调试、…...
本地离线运行更安全!AI人脸隐私卫士,保护隐私无需上传云端
本地离线运行更安全!AI人脸隐私卫士,保护隐私无需上传云端 在社交媒体分享、企业宣传、新闻报道等场景中,我们常常需要发布包含人物的照片。然而,未经处理的人脸信息一旦公开,就可能面临隐私泄露的风险。手动给照片中…...
液压与气压课程设计
液压与气压传动作为现代工业的核心技术之一,在机械装备、自动化设备等领域发挥着不可替代的作用。其核心原理是通过液体或气体的压力传递能量,实现动力传输与运动控制。相比机械传动,液压系统具备功率密度高、响应速度快、调速范围广等优势&a…...
04-Java JDK, JRE和JVM
Java JDK, JRE和JVM 在本教程中,您将了解JDK,JRE和JVM。您还将学习它们之间的主要区别。 什么是JVM? JVM(Java虚拟机)是使您的计算机运行Java程序的抽象机。 运行Java程序时,Java编译器首先将Java代码编…...
笑晕!我和朋友调试出一行“鬼畜C++代码”,4个nullptr叠满还能完美运行
文章目录 名场面开端:朋友扔来一行“看不懂但大受震撼”的代码调试之路:从“报错连连”到“逐渐正常”,每一步都在笑第一步:修正语法错误,括号和模板别乱套第二步:类型统一,解决“输出不对”的问…...
Arduino_CloudUtils:嵌入式物联网云通信核心工具库
1. Arduino_CloudUtils 库深度解析:嵌入式云通信核心工具链Arduino_CloudUtils 是 Arduino 官方为物联网云连接场景设计的底层通用工具库,其定位并非独立应用框架,而是作为 ArduinoIoTCloud 等上层云 SDK 的“基础设施层”。该库不处理网络协…...
VC0706摄像头模块UART驱动与状态机设计详解
1. VC0706 Camera Shield 驱动技术深度解析 1.1 芯片级架构与硬件接口特性 VC0706 是由深圳中星微电子(Vimicro)推出的低功耗、高集成度 JPEG 编码图像处理 SoC,广泛应用于早期嵌入式视觉模块。RadioShack 推出的 VC0706 Camera Shield 是基…...
聊一聊 C# 中的闭包陷阱:foreach 循环的坑你还记得吗?戳
. GIF文件结构 相比于 WAV 文件的简单粗暴,GIF 的结构要精密得多,因为它天生是为了网络传输而设计的(包含了压缩机制)。 当我们用二进制视角观察 GIF 时,它是由一个个 数据块(Block) 组成的&…...
Tiny C Compiler重新定义:从编译工具到C脚本引擎的技术革新
Tiny C Compiler重新定义:从编译工具到C脚本引擎的技术革新 【免费下载链接】tinycc Unofficial mirror of mob development branch 项目地址: https://gitcode.com/gh_mirrors/ti/tinycc 在传统C语言开发中,编译-链接-执行的繁琐流程一直是开发效…...
