TypeScript判斷兩個(gè)數(shù)組的內(nèi)容是否相等的實(shí)現(xiàn)
一、直接遍歷
// 1.直接遍歷 const arr1: any[] = ["apple", "banana", NaN]; const arr2: any[] = ["apple", NaN, "banana"]; function fn1(arr1: any[], arr2: any[]) { // Array.some(): 有一項(xiàng)不滿足,返回false if (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 會有問題
優(yōu)化版本
// 1.直接遍歷 const arr1: any[] = ["apple", "banana", NaN]; const arr2: any[] = ["apple", NaN, "banana"]; function fn1(arr1: any[], arr2: any[]) { // Array.some(): 有一項(xiàng)不滿足,返回false if (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() 是使用的嚴(yán)格相等算法 => NaN值永遠(yuǎn)不相等
Array.prototype.includes() 是使用的零值相等算法 => NaN值視作相等
二、把重復(fù)元素編號
// 2.把重復(fù)元素標(biāo)識編號 function fn3(arr1: any[], arr2: any[]) { if (arr1.length !== arr2.length) { return false; } // 重復(fù)數(shù)組元素 加1、2、3 const countArr1 = updateArray(arr1); const countArr2 = updateArray(arr2); // arr 數(shù)組 元素重復(fù)轉(zhuǎn)換成 val1,val2 function 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)) { // // 如果元素是第一次出現(xiàn),直接添加到結(jié)果數(shù)組 // countMap.set(ele, 0) // updateArr.push(ele) // } else { // // 如果元素已經(jīng)出現(xiàn)過,添加帶有編號的新元素到結(jié)果數(shù)組 // 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("把重復(fù)元素標(biāo)識編號 => ", fn3(array1, array2)); // true // 其實(shí)這種存在漏洞的 const array3 = ["apple", "banana", "cherry", "banana", 1, "1", "1"]; const array4 = ["banana", "apple", "banana", "cherry", "1", 1, 1]; // 應(yīng)該是false console.log("把重復(fù)元素標(biāo)識編號 存在漏洞 => ", fn3(array3, array4)); // true
三、統(tǒng)計(jì)元素次數(shù)
// 3.統(tǒng)計(jì)元素次數(shù) function fn4(arr1: any[], arr2: any[]) { if (arr1.length !== arr2.length) { return false; } // 創(chuàng)建計(jì)數(shù)對象,用于記錄每個(gè)元素在數(shù)組中的出現(xiàn)次數(shù) 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; } //檢查計(jì)數(shù)對象是否相等 // 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("統(tǒng)計(jì)元素次數(shù) => ", fn4(array5, array6)); // true console.log("統(tǒng)計(jì)元素次數(shù) => ", 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(); // 計(jì)算第一個(gè)數(shù)組的元素 for (const item of arr1) { countMap.set(item, (countMap.get(item) || 0) + 1); } // 比較第二個(gè)數(shù)組 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
總結(jié)
- 先判斷長度,長度不等,必然不等
- 元素可重復(fù)
- 邊界情況考慮
- ‘1’ 和 1 (Object的key是字符串,Map的key沒有限制)
- NaN
- null、undefined
相關(guān)知識
JS規(guī)范中的相等、嚴(yán)格相等、零值相等以及同值相等
- 非嚴(yán)格相等比較:==
- 嚴(yán)格相等比較:===(用于Array.prototype.indexOf(),Array.prototype.lastIndexOf(),case-matching)
- 零值相等:用于%TypeArray%和ArrayBuffer構(gòu)造函數(shù)、Map和Set操作、String.prototype.inclues()
- 同值相等:用于所有其他地方
零值相等:與同值相等類似,不過+0 與-0 相等
同值相等:確定兩個(gè)值是否在任何情況次啊功能上是相同的
到此這篇關(guān)于TypeScript判斷兩個(gè)數(shù)組的內(nèi)容是否相等的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)TypeScript判斷數(shù)組內(nèi)容相等內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- TypeScript 數(shù)組Array操作的常用方法
- TypeScript數(shù)組的定義與使用詳解
- typeScript中數(shù)組類型定義及應(yīng)用詳解
- TypeScript編寫自動創(chuàng)建長度固定數(shù)組的類型工具詳解
- TypeScript實(shí)現(xiàn)數(shù)組和樹的相互轉(zhuǎn)換
- TypeScript調(diào)整數(shù)組元素順序算法
- TypeScript中Array(數(shù)組)聲明與簡單使用方法
- TypeScript之元組、數(shù)組及as?const的使用
- TypeScript數(shù)組實(shí)現(xiàn)棧與對象實(shí)現(xiàn)棧的區(qū)別詳解
- TypeScript之元組、數(shù)組、多維數(shù)組定義方法以及 as const說明
相關(guān)文章
JavaScript上傳文件時(shí)不用刷新頁面方法總結(jié)(推薦)
這篇文章主要介紹了JavaScript上傳文件時(shí)不用刷新頁面方法,用js+css代碼詳細(xì)介紹了操作過程,需要的朋友可以參考下2017-08-08JavaScript函數(shù)封裝隨機(jī)顏色驗(yàn)證碼(完整代碼)
這篇文章主要介紹了JavaScript函數(shù)封裝隨機(jī)顏色驗(yàn)證碼(完整代碼),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12JavaScript代碼性能優(yōu)化總結(jié)(推薦)
下面小編就為大家?guī)硪黄狫avaScript代碼性能優(yōu)化總結(jié)(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考,一起跟隨小編過來看看吧,祝大家游戲愉快哦2016-05-05原生JS實(shí)現(xiàn)獲取及修改CSS樣式的方法
這篇文章主要介紹了原生JS實(shí)現(xiàn)獲取及修改CSS樣式的方法,結(jié)合實(shí)例形式簡單分析了JavaScript針對頁面元素屬性動態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-09-09JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_
今天在網(wǎng)上看到一篇很有意思的文章(需翻墻),解釋了幾段非常有趣的 JavaScript 代碼。你猜下面這段 JavaScript 代碼是什么意思?2011-02-02Vue3基于countUp.js實(shí)現(xiàn)數(shù)字滾動的插件
本文主要介紹了Vue3基于countUp.js實(shí)現(xiàn)數(shù)字滾動的插件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-04-04