JS Array:合並兩個有序數組並去重


前言

這個問題對於 Array 練習是一個很好的例子,並且也是面試中經常遇到的。

解題方法有多個,下面會逐個說下。

一、遍歷

用遍歷的方法實現應該是最先想到的方法。這個就需要對需要合並的數組合並再重新排序。

1、遍歷兩個數組

2、每一項:判斷合並后的數組中是否有當前項(去重)

/**
 * 對其中一個遍歷去重
 * @param {Array} arr1 
 * @param {Array} arr2 
 * @returns 合並后的有序去重數組
 */
function unionArray(arr1,arr2) {
  arr2.map(item=>{
    !arr1.includes(item) && arr1.push(item)
  })

  return arr1.sort()
}

上面的方法直接是用傳入的 arr1 進行操作的,在同時打印了結果和 arr1 ,發現 arr1  被改變了。

就對上面的進行了改動,這樣對原先的兩個數組就沒有影響了。

/**
 * 對其中一個遍歷去重
 * @param {Array} arr1 
 * @param {Array} arr2 
 * @returns 合並后的有序去重數組
 */
function unionArray(arr1,arr2) {
  const arrT = []
  arr1.map(item=>{
    !arrT.includes(item) && arrT.push(item)
  })
  arr2.map(item=>{
    !arrT.includes(item) && arrT.push(item)
  })

  return arrT.sort()
}

二、reduce

reduce 和上面的思路是一樣的,主要也是用遍歷,但是看起來相對簡單。

/**
 * 對其中一個遍歷去重
 * @param {Array} arr1 
 * @param {Array} arr2 
 * @returns 合並后的有序去重數組
 */
function unionArray2(arr1,arr2) {
  // let arrT = arr1.reduce((pre,next)=>{
  //   pre.includes(next) || pre.push(next)
  //   return pre
  // },[])
  let arrT = JSON.parse(JSON.stringify(arr1))

  arrT = arr2.reduce((pre,next)=>{
    pre.includes(next) || pre.push(next)
    return pre
  },arrT)

  return arrT.sort()
}

對於第一個數組的處理,可以用 reduce 遍歷,也可以直接用 JSON 序列化一下。

三、Set

用 Set 的原因是:Set 會自動對添加的項去重。這樣就不用手動判斷去重。

具體實現:

/**
 * 使用 Set 的去重實現
 *  主要 Set 的用法,需要使用 new 並且只能接收一個數組
 * @param {Array} arr1 
 * @param {Arra1} arr2 
 * @returns 合並后的有序去重數組
 */
function unionArray(arr1,arr2) {
  const newSet = new Set(arr1)
  arr2.map(item=>{
    newSet.add(item)
  })
  return [...newSet].sort()
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM