欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

TypeScript判斷兩個(gè)數(shù)組的內(nèi)容是否相等的實(shí)現(xiàn)

 更新時(shí)間:2023年11月12日 08:53:00   作者:心潮的滴滴  
本文主要介紹了TypeScript?判斷兩個(gè)數(shù)組的內(nèi)容是否相等,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、直接遍歷

// 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)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

最新評論