前言
這個問題對於 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() }
