Js判斷兩個(gè)數(shù)組是否相等的幾種常見場(chǎng)景
前言
日常開發(fā),時(shí)不時(shí)會(huì)遇到需要判定2個(gè)數(shù)組是否相等的情況,需要實(shí)現(xiàn)考慮的場(chǎng)景有:
- 先判斷長(zhǎng)度,長(zhǎng)度不等必然不等
- 元素位置
- 其他情況考慮
'1'和1(Object的key是字符串, Map的key沒有限制)NaNnull和undefined
1、通過數(shù)組自帶方法比較
// 方式1
function isArrEqual1(arr1, arr2) {
if (arr1.length !== arr2.length) {
return false;
}
return arr1.every((v, i) => v === arr2[i]);
// return !arr1.some((v, i) => v !== arr2[i]);
// return arr1.filter((v, i) => v !== arr2[i]).length === 0;
// return arr1.findIndex((v, i) => v !== arr2[i]) === -1;
}
// 測(cè)試
const arr1 = [-2, "-1", 0, 0.1, 1, "2", "a", "", undefined, null],
arr2 = [-2, "-1", 0, 0.1, 1, "2", "a", "", undefined, null];
isArrEqual1(arr1, arr2); // true
數(shù)組自帶的方法,比較適合的有:every、some、filter、findIndex。
這種方式嚴(yán)格限制了數(shù)組元素長(zhǎng)度、類型、位置必須一致。
注意包含NaN也無法比較!NaN是JS中唯一一個(gè)與自身不相等的存在!判斷NaN是否屬于同一個(gè)值得用Object.is(),如:Object.is(NaN, NaN); // true
2、通過循環(huán)判斷
// 方式2
function isArrEqual2(arr1, arr2) {
if (arr1.length !== arr2.length) {
return false;
}
for (let i = 0; i < arr1.length; i++) {
if (arr1[i] !== arr2[i]) {
return false;
}
}
return true;
}
這種判定方法限制及說明同上述方法1。
3、toString()
// 方式3
function isArrEqual3(arr1, arr2) {
if (arr1.length !== arr2.length) {
return false;
}
return arr1.toString() === arr2.toString();
}
// 測(cè)試
isArrEqual3(arr1, arr2); // true
const arr3 = ['', 1, null, undefined, {}, { a: 1 }, NaN, [], [2, 3], new Date()],
arr4 = ['', "1", undefined, null, {}, { a: 2 }, NaN, [], [2, "3"], new Date()];
isArrEqual3(arr3, arr4); // true
toString 方法是Object類型對(duì)象的實(shí)例方法,作用是返回一個(gè)對(duì)象的字符串形式。
這種方式限制了數(shù)組長(zhǎng)度和元素位置,但是會(huì)發(fā)現(xiàn)有些元素類型沒有嚴(yán)格限制,這是由于js本身進(jìn)行的數(shù)據(jù)隱式轉(zhuǎn)換!
在控制臺(tái)查看通過toString轉(zhuǎn)化后的數(shù)組,得到的結(jié)果如下:

此外,對(duì)數(shù)組、空數(shù)組、對(duì)象、空對(duì)象等引用類型,由于toString轉(zhuǎn)換結(jié)果都是[object Object],所以在比較的時(shí)候都會(huì)判定為相等!
還有,需要注意:
null == undefined // true null === undefined // false
4、join()
// 方式4
function isArrEqual4(arr1, arr2) {
if (arr1.length !== arr2.length) {
return false;
}
return arr1.join() === arr2.join();
}
join 方法是數(shù)組的一個(gè)實(shí)例方法,如果join這個(gè)方法如果不傳如分割符,其實(shí)作用幾乎和toString一樣,所以實(shí)現(xiàn)效果和限制同toString。

5、JSON.stringify()
// 方式5 [推薦]
function isArrEqual5(arr1, arr2) {
if (arr1.length !== arr2.length) {
return false;
}
return JSON.stringify(arr1) === JSON.stringify(arr2);
}
// 測(cè)試
isArrEqual5(arr1, arr2); // true
isArrEqual5(arr3, arr4); // false
const arr5 = [undefined, null, "", {}, { a: 1 }, NaN, [], [2, 3], new Date()],
arr6 = [undefined, null, "", {}, { a: 1 }, NaN, [], [2, 3], new Date()];
isArrEqual5(arr5, arr6); // true
JSON.stringify 用于將一個(gè)對(duì)象或值轉(zhuǎn)換成JSON字符串,轉(zhuǎn)換后結(jié)果會(huì)帶雙引號(hào)。

從測(cè)試結(jié)果可以看到,這個(gè)比較方式也嚴(yán)格的限制了數(shù)組長(zhǎng)度、元素位置和元素類型,在日常中比較推薦此種方案~
總結(jié)
到此這篇關(guān)于Js判斷兩個(gè)數(shù)組是否相等的幾種常見場(chǎng)景的文章就介紹到這了,更多相關(guān)Js判斷兩個(gè)數(shù)組相等內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Javascript實(shí)現(xiàn)Array和String互轉(zhuǎn)換的方法
這篇文章主要介紹了Javascript實(shí)現(xiàn)Array和String互轉(zhuǎn)換的方法,涉及JavaScript中toString方法與split方法的使用技巧,需要的朋友可以參考下2015-12-12
分享十八個(gè)殺手級(jí)JavaScript單行代碼
這篇文章主要給大家分享了十八個(gè)殺手級(jí)JavaScript單行代碼,這些單行代碼可以幫助你提高工作效率并可以幫助調(diào)試代碼,對(duì)大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2021-10-10
js實(shí)現(xiàn)點(diǎn)擊切換checkbox背景圖片的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)硪黄猨s實(shí)現(xiàn)點(diǎn)擊切換checkbox背景圖片的簡(jiǎn)單實(shí)例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-05-05
微信小程序使用swiper組件實(shí)現(xiàn)類3D輪播圖
在寫微信小程序時(shí),有寫到實(shí)現(xiàn)3D輪播圖的效果,可以直接使用微信小程序中自帶的組件swiper來實(shí)現(xiàn)。下面通過實(shí)例代碼給大家介紹微信小程序輪播圖的實(shí)現(xiàn)方法,感興趣的朋友一起看看吧2018-08-08
JS Object構(gòu)造函數(shù)之Object.freeze
這篇文章主要介紹了JS Object構(gòu)造函數(shù)之Object.freeze,對(duì)JS感興趣的同學(xué),可以深入了解下2021-04-04

