JS判断两个数组是否相等,元素以及顺序相等,顺序不同但元素相等
判断两个数组是否相等一般有两种场景。
第一种是数组完全相等,即数组元素相同且元素顺序一致;
第二则为元素相同但顺序不同。 数组完全相等
如果数组元素只是字符串,数字,布尔值这些类型,可以考虑使用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
但上述两种做法,都无法对比数组中包含undefined,null的情况,比如如下对比就暴露了问题: [undefined, 1, null, false].join("") === ["", 1, null, false].join("");// true
这是因为对于join而言,undefined与null都会 被转为空字符串,所以上述代码左右两边得到的都是"1flase",因此相等。
而对于JSON.stringify而言同样会存在这样的问题,比如如下例子: JSON.stringify([undefined, 1, NaN]) === JSON.stringify([null, 1, null]);// true
这是因为对于JSON.stringify而言,undefined和NaN都会被转为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它也能有效判断。
在导入excel表格场景中,也可以使用此方法来校验表头,判断是否使用正确的导入模版。 元素相同顺序不同
有这样一种场景,我们认定两个元素相同但顺序不同的数组为相同数组,比如数组[A,B]与[B,A]是相同数组。
比如一个功能设置模块,默认就勾选了[A,B]两个选项,下方会有一个更新按钮,只有用户修改了设置才会将更新按钮变为可点击状态,毕竟设置没改,就没更新的必要。
考虑到实际场景中对于值的唯一性维护,因此数组中理论上不会存在相同的值,因此我们可以这么实现: 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
针对这种情况还是得考虑将两个数组进行排序,再按数组完全相等的思路对每一位进行对比。 const isArrEqual = (arr1, arr2) => { return arr1.length === arr2.length && arr1.sort().every((ele, index) => Object.is(ele, arr2.sort()[index])); }; isArrEqual([1, 1], [1, null]);// false isArrEqual([null, 1], [1, null]);// true
农村人得了大病没钱医治了该怎么办?现如今国家对看不起病的有着重大保障,只要否合大病种类年均可报30余万,有低保的可免缴合疗保险,看病报销可达90以上,五保户看病全有民镇保障,一般贫困户有病先住院,出院一站式结算,报
农村户口每年交600元养老保险,十五年后六十岁,能领到多少养老金呢?总得来说,新农保养老金基础养老金(现为70元)(十五年个人帐户总数除以139个月)1关于2017年养老保险一般养老金每年的调整时间为7月1日,但关于2017年城乡养老金将全面上调已
张云雷要开演唱会了,你们期待在哪个城市开他的第一场演唱会?看到很多反对二爷开演唱会的,先说下自己的看法支持二爷一切形式的多栖发展,希望二爷按着自己的规划去做自己想做的事情,开心就好因为二爷跟二奶奶们承诺过,永远不会离开相声舞台,二爷说自己
刺激战场菜鸟所讨厌的装备却被大神所宠爱,你知道是哪几种吗?绝地求生刺激战场已经上线将近一年的时间了,但这款游戏依旧有很多的萌新,他们在装备道具选择方面非常纠结,并不知道该如何选对物资进行抉择。有很多不被菜鸟玩家所喜爱的道具,却是大神心目中
王者荣耀星耀5段位是什么水平?我是威威给你说王者,分享王者峡谷的最新资讯和动态,欢迎点赞,留言,吐槽,以及关注。在威威看来,星耀五这个段位在现在的S15赛季还是小强势的,因为目前的星耀五是从上个赛季的王者二十星
为什么有人说王者荣耀国际版和日版都比国服精美细致得多?其实,要说王者荣耀国际服,日服比国服精美得多,这一点囧王者是不同意的。其实王者荣耀国际版和国服版,是截然不同的两个游戏。本次亚运会上,老帅他们打的就是王者荣耀国际版(AOV)。大家
易建联能否打爆周琦?当然不能。首先来探讨技术能力。一年前周琦在cba最后一个赛季,易建联相比周琦有如下几个技术能力优点一,中远距离结合突破优势。这是由易建联在广东地位决定的,他是广东队的主攻点,有大把
现在19元每月200G流量,还有必要办宽带吗?在家里一家人用WiFi,速度快,稳定,比流量好太多了。如果只是一个人用,可以不办宽带如果是一家人,当然要办宽带,宽带稳定,一家人都可以用。这要看你家需不需要,你家电视不需要宽带吗,
为什么很多羽绒服都是黑色的?说到冬天保暖的衣服,羽绒服绝对是NO。1!毕竟冬天想要抗冻,还是得靠装备,羽绒服的保暖性没的说,近些年羽绒服的款式也是越来越多样,款式也逐渐时尚了起来,并不会像以前一样,走在大街上
你从哪个瞬间开始决定不化妆了?1。在将近一年的时间里,我一直在用双眼皮贴。理由很简单,这玩意起初给了我极大的惊艳感,几乎胜过此前使用过的任何化妆品。我头一回知道,我眼睛的轮廓可以那么深,画完眼妆可以如此神采奕奕
刚一卖出的股票,被卖的股票就涨起来了,是不是帐户被庄家监视了呢?放心,主力没那么无聊,其次也别把自己想的那么重要!大部分的散户会出现卖了涨,买了跌的情况是因为90的时候是进入主力陷阱之中的!特别是那些短线指标,图形甚至是消息面利空利好,都是配合