数组中删除重复数据/删除重复对象/删除全部重复对象

从一个数组中删除重复数据/删除重复对象/删除全部重复对象

1、简单数组去重

可以借用数组的 filter()方法和indexOf()方法,由于 indexOf(item) 返回的是数组中第一个item的索引,所以可以借此实现数组元素去重的功能

const names = ['张三', '李四', '张三'];

function getUnique(arr) {
  return arr.filter((item, index) => arr.indexOf(item) === index)
}

getUnique(names); // ["张三", "李四"]

2、数组中删除重复对象

如果数组的元素是对象,就不那么简单了。众所周知,对象是引用类型,比较两个对象不是比较对象的属性和值而是比较对象的地址值

const goodsList = [
  {
    goodsCode: '2611201047G',
    goodsName: '华为畅享9 Plus 4GB+128GB 极光紫 双卡 全网通版 JKM-AL00'
  },
  {
    goodsCode: '2611201418G',
    goodsName: 'HUAWEInova5i 8GB+128GB 苏音蓝 全网通版'
  },
  {
    goodsCode: '2611201047G',
    goodsName: '华为畅享9 Plus 4GB+128GB 极光紫 双卡 全网通版 JKM-AL00'
  }
]

function getUnique(arr) {
  const map = {};
  // 1、把数组元素作为对象的键存起来(这样就算有重复的元素,也会相互替换掉)
  arr.forEach(item => map[JSON.stringify(item)] = item);
  
  // 2、再把对象的值抽成一个数组返回即为不重复的集合
  return Object.keys(map).map(key => map[key])
}

getUnique(goodsList); 

/*
  [
    {goodsCode: "2611201047G", goodsName: "华为畅享9 Plus 4GB+128GB 极光紫 双卡 全网通版 JKM-AL00"},
    {goodsCode: "2611201418G", goodsName: "HUAWEInova5i 8GB+128GB 苏音蓝 全网通版"}
  ]
*/

但是这里有一个问题,假如把 goodsList 中最后一个元素的 goodsCode 和 goodsName调换一下顺序,就没法去重了,

可以通过 JSON.stringify的第二个参数指定按一定的顺序来序列化,如下:

function getUnique2(arr) {
  const map = {};
  // 1、把数组元素作为对象的键存起来(这样就算有重复的元素,也会相互替换掉)
  arr.forEach(item => map[JSON.stringify(item, ['goodsCode', 'goodsName'])] = item);
  
  // 2、再把新对象的键名抽成一个数组返回即为不重复的集合
  return Object.keys(map).map(key => JSON.parse(key))
}

console.log(getUnique2(goodsList)); 
/*
  [
    {goodsCode: "2611201047G", goodsName: "华为畅享9 Plus 4GB+128GB 极光紫 双卡 全网通版 JKM-AL00"},
    {goodsCode: "2611201418G", goodsName: "HUAWEInova5i 8GB+128GB 苏音蓝 全网通版"}
  ]
*/

3、数组中删除全部重复对象 

// 封装方法,删除数组中重复数据
getUnique (arr) {
  let newArr = [...arr];
  let indexArr = [];
  arr.forEach((s, i) => {
    let count = 0;
    newArr.forEach((m, j) => {
      if (arr[i].code == newArr[j].code) { // 当属性值都相同时,打印索引位置
        count++;
      }
    })
    // console.log("索引:",i,"相同次数:",count)
    if (count > 1) { // 内层循环结束,当count>1,说明此索引为对象是重复的
      indexArr.push(i);
    }
  })
  // console.log(indexArr) //相同对象索引数组
  let flag = -1;
  for (var i = 0; i < indexArr.length; i++) { // 删除一次,索引位
    flag++;
    if (flag == 0) {
      newArr.splice(indexArr[i], 1);
    } else {
      newArr.splice(indexArr[i] - flag, 1); // 每次删除,需要删除的索引位就要减去1
    }
  }
  return newArr
}

使用示例如下:

// 封装方法,删除数组中重复数据
getUnique (arr) {
  let newArr = [...arr];
  let indexArr = [];
  arr.forEach((s, i) => {
    let count = 0;
    newArr.forEach((m, j) => {
      if (arr[i].code == newArr[j].code) { // 当属性值都相同时,打印索引位置
        count++;
      }
    })
    // console.log("索引:",i,"相同次数:",count)
    if (count > 1) { // 内层循环结束,当count>1,说明此索引为对象是重复的
      indexArr.push(i);
    }
  })
  // console.log(indexArr) //相同对象索引数组
  let flag = -1;
  for (var i = 0; i < indexArr.length; i++) { // 删除一次,索引位
    flag++;
    if (flag == 0) {
      newArr.splice(indexArr[i], 1);
    } else {
      newArr.splice(indexArr[i] - flag, 1); // 每次删除,需要删除的索引位就要减去1
    }
  }
  return newArr
},
// 复选框选择按钮
importSelectChange (val) {
  this.selectImport.push(val)
  // 获取选择的文件
  let newArr = this.getUnique(this.selectImport)
  this.selectImport = newArr;
}
posted @ 2021-04-28 16:46  X_LLin  阅读(564)  评论(0编辑  收藏  举报