javascript - 使用 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)
}
})
解决方案
您可以为数组中的每个键创建一个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])
推荐阅读
- java - 如何在 Netbeans 的类中移动成员
- php - 如何向 JSON 请求响应添加回调?
- three.js - 如何在 Three.js 上的透视相机上创建旋转?
- javascript - Toggle 显示具有自定义属性的 HTML 节点列表元素
- casting - Eiffel:带有附加和检查的经典类型转换开关结构
- android - 在 Android Studio 中显示 Cordova“console.log”条目
- angular - 错误:“尝试代理时发生错误:localhost:4200/api/login” angular2 项目
- javascript - 在nodejs中加载更多按钮
- javascript - 通过仅传递一次 props 来多次执行状态和数组操作
- django - Django DRF 创建相关对象的权限