使用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()
来获取对象中的键数组。您可以检查数组长度是否相等,然后检查两个对象中的值是否匹配。所有对象是否具有相同的键集,或者是否缺少键集?所有对象都具有相同的键集,但对象中的序列与其随机序列不同。