壹 ❀ 引

在日常开发中,判断两个数组是否相等应该是较为常见的场景,因为常用,所以想着简单记录下。关于判断数组相等,这里我分为两种场景,第一种是数组完全相等,即数组元素相同且元素顺序一致;第二则为元素相同但顺序不同,我会分开讨论。

注意,这里不讨论数组元素是函数,正则等特殊情况,因为实际开发中也很难遇到这样的场景。但如果需要对比的数组是多维数组,可以考虑利用flat进行降维再使用如下方法,OK,本文开始。

贰 ❀ 数组完全相等

如果数组元素只是字符串,数字,布尔值这些类型,可以考虑使用JSON.stringify或者join('')的做法,目的就是转为字符串,直接判断字符串是否相等,比如:

// 基于join解决基本判断
const isArrEqual = (arr1, arr2) => {
return arr1.join("") === arr2.join("");
};
isArrEqual([1, 2, 3], [1, 2, 3]);// true
isArrEqual([1, '', 'b', false], [1, '', 'b', false]);// true
isArrEqual([1], [1, 2]);// false // 基于JSON.stringify解决基本判断
const isArrEqual = (arr1, arr2) => {
return JSON.stringify(arr1) === JSON.stringify(arr2);
};
isArrEqual([1, 2, 3], [1, 2, 3]);// true
isArrEqual([1, '', 'b', false], [1, '', 'b', false]);// true
isArrEqual([1], [1, 2]);// false

但上述两种做法,都无法对比数组中包含undefinednull的情况,比如如下对比就暴露了问题:

[undefined, 1, null, false].join("") === ['', 1, null, false].join("");// true

这是因为对于join而言,undefinednull都会 被转为空字符串,所以上述代码左右两边得到的都是'1flase',因此相等。

而对于JSON.stringify而言同样会存在这样的问题,比如如下例子:

JSON.stringify([undefined, 1, NaN]) === JSON.stringify([null, 1, null]);// true

这是因为对于JSON.stringify而言,undefinedNaN都会被转为null,这才导致上述代码相等。

因此考虑基本数据类型以及NaN,其实可以这么实现它:

const isArrEqual = (arr1, arr2) => {
return arr1.length === arr2.length && arr1.every((ele, index) => Object.is(ele, arr2[index]));
};
isArrEqual([1, 'b', false, undefined, null, NaN], [1, 'b', false, undefined, null, NaN]);// true

这里利用了Object.is方法,它接受两个参数,用于核对这两个参数是否相等,即便是NaN它也能有效判断。

叁 ❀ 元素相同顺序不同

在实际开发中,会有这样一个场景,需要我们认定两个元素相同但顺序不同的数组为相同数组,比如数组[A,B][B,A]是相同数组。

比如一个功能设置模块,默认就勾选了[A,B]两个选项,下方会有一个更新按钮,只有用户修改了设置才会将更新按钮变为可点击状态,毕竟设置没改,就没更新的必要。

那么现在我将这两个选项清空,随后勾选B,再勾选A,很明显,这个数据层保存的数据为[B,A],但对于用户而言,我并未修改任何设置,此时按钮其实就没必要展示为可点击状态,因此我们需要认定[A,B][B,A]为相同值。

考虑到实际场景中对于值的唯一性维护,因此数组中理论上不会存在相同的值,因此我们可以这么实现:

const isArrEqual = (arr1, arr2) => {
return arr1.length === arr2.length && arr1.every((ele) => arr2.includes(ele));
};
isArrEqual([1, 'b', false, undefined, null, NaN], [1, null, 'b', undefined, false, NaN]);// true

注意,上述实现是考虑到特殊场景不会让数组有重复项,因此可以这么实现,但如果数组有重复元素上述实现就不可行,比如这个例子就不OK:

isArrEqual([1, 1], [1, null]);// true

针对这种情况还是得考虑将两个数组进行排序,再按数组完全相等的思路对每一位进行对比。

另外,关于JSON.stringify其实还有其它妙用,可参考博主这篇文章,json.stringify()的妙用,json.stringify()与json.parse()的区别

NaN是JS中唯一一个与自身不相等的存在,如何判断一个值是否等于NaNwindow.isNaNNumber.isNaN又有什么区别?有兴趣可以阅读博主这篇文章js中的NaN,isNaN与Number.isNaN的区别,如何判断一个值严格等于NaN

那么本文到这里结束。

JS 判断两个数组是否相等,元素以及顺序相等,顺序不同但元素相等的更多相关文章

  1. JS判断两个数组的元素是否完全相等

    1.使用ES6 新增的扩展运算符和Set新数据类型判断两个数组是否包含有相同的元素 var arr1 = ['green' , 'yellow' ,'blue' ,'red']; var arr2 = ...

  2. JS取出两个数组的不同或相同元素

    JS合并两个数组的方法 我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况.比如: var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合 ...

  3. js中的传值和传引用,判断两个数组是否相等

    所谓js的中的传值,其实也就是说5种基本数据类型(null,undefind,boolean,number,string) 传引用也就是说的那个引用数据类型,(array和objec) 基本数据类型的 ...

  4. JS合并两个数组的方法

    JS合并两个数组的方法 我们在项目过程中,有时候会遇到需要将两个数组合并成为一个的情况.比如: var a = [1,2,3]; var b = [4,5,6]; 有两个数组a.b,需求是将两个数组合 ...

  5. 判断两个数组是否相似 (arraysSimilar)

    题目 解答 思路 具体实现代码 总结 题目 题目来自 慕课网 JavaScript 深入浅出 1-6 编程练习 请在 index.html 文件中,编写 arraysSimilar 函数,实现判断传入 ...

  6. js判断是否为数组

      js判断是否为数组类型 CreateTime--2018年5月18日14:38:58 Author:Marydon 1.错误方式 使用typeof 返回的是object 2.正确方式 方式一:使用 ...

  7. php判断两个数组是否相等

    php判断两个数组是否相等 一.总结 一句话总结: php判断两个数组是否相等可以直接上==或者===号 二.php 判断两个数组是否相等 转自或参考:php 判断两个数组是否相等https://ww ...

  8. JS 比较两个数组是否相等 是否拥有相同元素

    Javascript怎么比较两个数组是否相同?JS怎么比较两个数组是否有完全相同的元素?Javascript不能直接用==或者===来判断两个数组是否相等,无论是相等还是全等都不行,以下两行JS代码都 ...

  9. JS比较两个数组是否相等 是否拥有相同元素

    Javascript怎么比较两个数组是否相同?JS怎么比较两个数组是否有完全相同的元素?Javascript不能直接用==或者===来判断两个数组是否相等,无论是相等还是全等都不行,以下两行JS代码都 ...

  10. JS取出两个数组中的不同或相同元素

    1.取出两个数组的不同元素 var arr1 = [0,1,2,3,4,5]; var arr2 = [0,4,6,1,3,9]; function getArrDifference(arr1, ar ...

随机推荐

  1. Kubernetes 疑难杂症汇总

    1. 部署报错:The requested fsGroup is 123, but the volume local-pv-c7ef339e has GID 1000710000. The volum ...

  2. LLM面面观之Prefix LM vs Causal LM

    1. 背景 关于Prefix LM和Causal LM的区别,本qiang在网上逛了一翻,发现多数客官只给出了结论,但对于懵懵的本qiang,结果仍是懵懵... 因此,消遣了多半天,从原理及出处,交出 ...

  3. SV 数据类型-2

    动态数组 数组定义的时候不用给定数组元素个数 动态数组实例 例1 队列

  4. DC - 设计和工艺数据

    环境建立命令与变量 综合主要的三部分:RTL\目标工艺库\约束文件 DC综合过程中timing > area,在时序满足的条件下进行面积优化 RTL一般会映射为standcell(与非门),需要 ...

  5. Java基础篇(05):函数式编程概念和应用

    目录 一.函数式概念 二.函数与方法 三.JDK函数基础 1.Lambda表达式 2.函数式接口 四.Optional类 1.Null判断 2.Optional应用 五.Stream流 一.函数式概念 ...

  6. kind-微k8s-测试与开发

    0. kind 简介 开发与测试场景: 通过docker容器来模拟k8s节点 Github:https://github.com/kubernetes-sigs/kind 1. Kind 安装 os: ...

  7. 使用Python+FFMPEG实现视频分割与合并

    前言 日常中偶尔会遇到需要简单剪辑处理视频的场景,以前我可能会拿出PR来剪辑一下,(别跟我说国产那些软件,剪辑完视频强制加上广告片头片尾恶心的一批),但是PR毕竟太重量级,剪个简单的视频都要花不少时间 ...

  8. [转帖]一文深度讲解JVM 内存分析工具 MAT及实践(建议收藏)

    https://juejin.cn/post/6911624328472133646 1. 前言 熟练掌握 MAT 是 Java 高手的必备能力,但实践时大家往往需面对众多功能,眼花缭乱不知如何下手, ...

  9. [转帖]TiFlash 简介

    overview TiFlash 是 TiDB HTAP 形态的关键组件,它是 TiKV 的列存扩展,在提供了良好的隔离性的同时,也兼顾了强一致性.列存副本通过 Raft Learner 协议异步复制 ...

  10. 最小化安装的CentOS7 上面安装Oracle12C的简单过程

    首先声明自己对静默安装不熟,也害怕初问题,所以不使用静默安装的方式. 因为是最小化安装,所以必须安装GUI界面才可以,以下是过程(早上回忆的,全文字,无截图) 1. 安装GUI界面 yum group ...