Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用JavaScript验证对象数组中的重复对象_Javascript - Fatal编程技术网

使用JavaScript验证对象数组中的重复对象

使用JavaScript验证对象数组中的重复对象,javascript,Javascript,我有一个如下形式的对象数组 let test = [ { RowCreationMethod: "excel", deviceID: "123ECd9", deviceName: "ZENW42NLPC0378", devicePrimary: "Yes", deviceType: "Laptop", employeeID: 101, isExists: "No", isRescheduled: "No", vipUser: "Yes" },{ RowCreationMet

我有一个如下形式的对象数组

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)
  }
})

要检查浅相等,可以使用获取两个对象的关键帧,比较它们的长度,然后检查每个值是否相等

let测试=[
{
RowCreationMethod:“excel”,
设备ID:“123ECd9”,
设备名称:“ZENW42NLPC0378”,
devicePrimary:“是的”,
设备类型:“笔记本电脑”,
雇员编号:101,
伊斯兰主义者:“不”,
isRescheduled:“否”,
小蛇:“是的”
},{
RowCreationMethod:“excel”,
设备名称:“ZENW42NLPC0378”,
devicePrimary:“是的”,
设备类型:“笔记本电脑”,
设备ID:“123ECd9”,
雇员编号:101,
伊斯兰主义者:“不”,
isRescheduled:“否”,
小蛇:“是的”
}];
设final=[];
test.forEach(x=>{
if(!final.some(y=>objectShallowEquals(x,y))){
最后,推(x);
}
});
控制台日志(最终);
函数objectShallowEquals(obj1、obj2){
常量键=对象键(obj1);
const keys2=Object.keys(obj2);
如果(keys.length!=keys2.length)返回false;
for(键的常数键){
如果(!(输入obj2)| obj1[key]!==obj2[key])返回false;
}
返回true;
}
您可以为数组中的每个键创建一个数组。然后,使用根据每个对象的唯一值字符串对数组进行分组。i、 e.一个字符串,对象的值由
|
分隔,顺序与
所有键的顺序相同。例如,对于给定的2个对象,它将如下所示:

"excel|123ECd9|ZENW42NLPC0378|Yes|Laptop|101|No|No|Yes"
如果另一个对象具有相同的字符串,它将在累加器对象中被覆盖

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

var测试=[{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”}];
函数唯一对象(数组){
常量集=新集(array.flatMap(Object.keys)),
allKeys=Array.from(集合);
常量组=数组。减少((acc,o)=>{
const unique=allKeys.map(k=>o[k]).join(“|”);
acc[unique]=o;
返回acc
}, {})
返回对象值(组)
}

console.log(uniqueObjects(test))
您可能可以使用
JSON.stringify(Object.values(y.sort())
。最坏情况:循环遍历对象属性,并对每个属性进行比较。如果这样做,请运行现有的JSON比较,并仅在false时进行子迭代,以尽可能保持快速。您还可以使用[].filter而不是forEach来收集不带[].push()的Unique。您可以使用
Object.keys()
来获取对象中的键数组。您可以检查数组长度是否相等,然后检查两个对象中的值是否匹配。所有对象是否具有相同的键集,或者是否缺少键集?所有对象都具有相同的键集,但对象中的序列与其随机序列不同。