数组中元素是对象的去重方法

当数组中包含对象时,普通的去重方法无法将两个相同的对象识别出来,从而达不到去重的效果

const arr = [
  { a: 1, b: 2 },
  { a: 4, b: 5 },
  { a: 1, b: 2 },
  { a: 6, b: 7 },
  { a: 1, b: 2 },
]
复制代码

在这个数组中,数组元素都是对象,且第1、第3、第5项相同,如果用 indexOf 的方法去重,会得到如下结果

function unique(arr){
  let b = []
  for(let i = 0; i < arr.length; i++){
    if(b.indexOf(arr[i]) === -1){
      b.push(arr[i])
    }
  }
  return b
}

b  // b 与 arr 相同,未达到去重效果
复制代码

使用 Set 去重

const b = Array.from(new Set(arr))

b  // b 与 arr 相同,未达到去重效果
复制代码

以上两种方法均未实现去重效果

那么该如何实现?

其实改良一下之前的方法就可以达到去重效果

  1. 将数组元素转化为字符串,并设置为空对象的属性名,然后赋值以实现去重
function unique(arr) {
  let b = []
  let hash = {}
  for (let i = 0; i < arr.length; i++) {
    if (!hash[JSON.stringify(arr[i])]) {
      hash[JSON.stringify(arr[i])] = true
      b.push(arr[i])
    }
  }
  return b
}

const b = unique(arr)

console.log(b) 
// 成功实现去重
[
  { a: 1, b: 2 },
  { a: 4, b: 5 },
  { a: 6, b: 7 },
]
复制代码
  1. 通过将数组的每一项转换为字符串,两次循环进行对比去重
function unique1(arr) {
  let b = []
  for (let i = 0; i < arr.length; i++) {
    let unexit = true
    for (let j = i + 1; j < arr.length; j++) {
      if (JSON.stringify(arr[i]) === JSON.stringify(arr[j])) {
        unexit = false
        break
      }
      else {
        unexit = true
      }
    }
    if (unexit) {
      b.push(arr[i])
    }
  }
  return b
}

const b = unique(arr)

console.log(b) 
// 成功实现去重
[
  { a: 1, b: 2 },
  { a: 4, b: 5 },
  { a: 6, b: 7 },
]
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享