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()
}
原文地址:https://www.cnblogs.com/zhurong/p/14647994.html