一.数组遍历
function Uniarray(array) {
// 接收去重后的数组
let resArr = [];
// 遍历数组
for (let i = 0; i < array.length; i++) {
let isFind = false;
// 检查当前元素是否已存在于结果数组中
for (let j = 0; j < resArr.length; j++) {
// 使用严格相等运算符(===)来比较元素
if (objectsAreEqual(array[i], resArr[j])) {
isFind = true;
break;
}
}
// 如果元素不在结果数组中,则添加到结果数组
if (!isFind) {
resArr.push(array[i]);
}
}
return resArr;
}
二.判断是否是原始值
使用typeof运算符来判断一个值是否是原始值。原始值包括数字、字符串、布尔值、null和undefined。
如果一个值不是原始值,那么它就是对象或函数。
function isPrimitive(value) {
return value === null || typeof value !== 'object' && typeof value !== 'function';
}
三.对象比较
!keys2.includes(key)检查当前属性名是否也存在于中keys2。
如果键不存在于keys2,则意味着两个对象具有不同的键集,并且该函数应返回false。
!objectsAreEqual(obj1[key], obj2[key])比较与两个对象中当前键关联的值。
它递归调用objectsAreEqual以检查值是否相等以及存在对象嵌套的情况。
如果值不相等,则意味着对象不相等,函数应返回false。
function objectsAreEqual(obj1, obj2) {
if (isPrimitive(obj1) || isPrimitive(obj2)) {
return obj1 === obj2;
}
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length) {
return false;
}
for (const key of keys1) {
if (!keys2.includes(key) || !objectsAreEqual(obj1[key], obj2[key])) {
return false;
}
}
return true;
}
四.运行测试
/**
* 数组去重
* @param array
* @returns array
*/
function Uniarray(array) {
let resArr = [];
for (let i = 0; i < array.length; i++) {
let isFind = false;
for (let j = 0; j < resArr.length; j++) {
if (objectsAreEqual(array[i], resArr[j])) {
isFind = true;
break;
}
}
if (!isFind) {
resArr.push(array[i]);
}
}
return resArr;
}
/**
* 判断原始值
* @param *
* @return boolean
*/
function isPrimitive(value) {
return value === null || typeof value !== 'object' && typeof value !== 'function';
}
/**
*
* @param object
* @param object
* @return boolean
*/
function objectsAreEqual(obj1, obj2) {
if (isPrimitive(obj1) || isPrimitive(obj2)) {
return obj1 === obj2;
}
const keys1 = Object.keys(obj1);
const keys2 = Object.keys(obj2);
if (keys1.length !== keys2.length) {
return false;
}
for (const key of keys1) {
if (!keys2.includes(key) || !objectsAreEqual(obj1[key], obj2[key])) {
return false;
}
}
return true;
}
const arr1=[{a:'1',b:'1'},{a:'1',b:'2'},{a:'1',b:'1'}]
const arr2=[{a:'1',b:undefined},{a:'1',b:'2'},{a:'1',c:undefined}]
const arr3=[{a:{c:1},b:'1'},{a:{c:1},b:'1'},{a:{c:1},b:'2'}]
console.log(Uniarray(arr1))
console.log(Uniarray(arr2))
console.log(Uniarray(arr3))