首页 > 解决方案 > 使用 JavaScript 验证对象数组中的重复对象

问题描述

我有以下形式的对象数组,

let test = [
{
 RowCreationMethod: "excel",
 deviceID: "123ECd9",
 deviceName: "ZENW42NLPC0378",
 devicePrimary: "Yes",
 deviceType: "Laptop",
 employeeID: 101,
 isExists: "No",
 isRescheduled: "No",
 vipUser: "Yes"
 },{
 RowCreationMethod: "excel",
 deviceName: "ZENW42NLPC0378",
 devicePrimary: "Yes",
 deviceType: "Laptop",
 deviceID: "123ECd9",
 employeeID: 101,
 isExists: "No",
 isRescheduled: "No",
 vipUser: "Yes"
 }];

我编写了以下代码来检查它们是否退出了我的数组中的任何重复对象,但如果我更改了任何对象属性的顺序,那么它就不起作用,因为在我的代码中,我将对象转换为字符串并对其进行验证。

这是我的代码

let final = []
test.forEach(x => {
  if(!final.some(y => JSON.stringify(y) === JSON.stringify(x))){
    final.push(x)
  }
})

标签: javascript

解决方案


您可以为数组中的每个键创建一个Set。然后,使用reduce基于每个对象的唯一值字符串对数组进行分组。即一个字符串,其对象的值按与.| 相同的顺序分隔allKeys。例如,对于给定的 2 个对象,它将如下所示:

"excel|123ECd9|ZENW42NLPC0378|Yes|Laptop|101|No|No|Yes"

如果另一个对象具有相同的字符串,它将在累加器对象中被覆盖。

即使某些对象缺少键,这也会起作用

var test=[{RowCreationMethod:"excel",deviceID:"123ECd9",deviceName:"ZENW42NLPC0378",devicePrimary:"Yes",deviceType:"Laptop",employeeID:101,isExists:"No",isRescheduled:"No",vipUser:"Yes"},{RowCreationMethod:"excel",deviceName:"ZENW42NLPC0378",devicePrimary:"Yes",deviceType:"Laptop",deviceID:"123ECd9",employeeID:101,isExists:"No",isRescheduled:"No",vipUser:"Yes"}];

function uniqueObjects(array) {
  const set = new Set(array.flatMap(Object.keys)),
        allKeys = Array.from(set);
        
  const group = array.reduce((acc, o) => {
    const unique = allKeys.map(k => o[k]).join('|');
    acc[unique] = o;
    return acc
  }, {})
  
  return Object.values(group)
}

console.log(uniqueObjects(test))

如果每个对象都具有相同的键集,则可以跳过该Set步骤并将其替换为

const allKeys = Object.keys(array[0])

推荐阅读