需求:只要对象内的属性长度一样,且key,value一致就认为是这两个对象相同
const arr = [
{ a: 1, b: 2 },
{ b: 2, a: 1 },
{ a: 1, b: 2, c: { a: 1, b: 2 } },
{ b: 2, a: 1, c: { b: 2, a: 1 } },
{ b: 2, a: 1, c: { b: 2, a: 1, c: 3 } },
{ b: 2, a: 1, c: { c: 2, b: 1, a: 3 } },
{ b: 2, a: 1, c: { c: 3, b: 2, a: 1 } },
];
// 判断对象是否为空对象
const isObject = (val) => typeof val === "object" && val !== null;
// 比较两个对象是否相等
function equals(value1, value2) {
if (isObject(value1) && isObject(value2)) {
// 分别拿到两个对象的所有属性名
const keys1 = Object.keys(value1),
keys2 = Object.keys(value2);
// 如果两个对象属性的数量不同,那么对象肯定不相等
if (keys1.length !== keys2.length) {
return false;
}
// 如果属性数量相同,就循环任意一个对象的属性,这里循环 keys1
for (const k of keys1) {
// 判断 keys1 的属性是否在 keys2 中存在,
// 如果有不存在的属性,说明一个对象有一个对象没有,那么对象肯定不相等
if (!keys2.includes(k)) {
return false;
}
// 如果说这个属性在两个对象里都有,那么就递归比较他们的属性值
if (!equals(value1[k], value2[k])) {
return false;
}
}
// 如果说整个循环结束都没有任何不一样的点
// 那么说明这两个对象是一样的
return true;
} else {
return value1 === value2;
}
}
const newArr = [...arr];
for (let i = 0; i < newArr.length; i++) {
for (let j = i + 1; j < newArr.length; j++) {
// 使用 equals 函数来判断重复
if (equals(newArr[i], newArr[j])) {
newArr.splice(j, 1);
}
}
}
console.log("newArr===>>> ", newArr);