前言
这个问题对于 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() }