JavaScript中包含对象的数组去重

一.数组遍历

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';
}

三.对象比较

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;
    }
     // !keys2.includes(key)检查当前属性名是否也存在于中keys2。
        // 如果键不存在于keys2,则意味着两个对象具有不同的键集,并且该函数应返回false。

        // !objectsAreEqual(obj1[key], obj2[key])比较与两个对象中当前键关联的值。
        // 它递归调用objectsAreEqual以检查值是否相等以及存在对象嵌套的情况。
        //如果值不相等,则意味着对象不相等,函数应返回false。
    for (const key of keys1) {
        if (!keys2.includes(key) || !objectsAreEqual(obj1[key], obj2[key])) {
            return false;
        }
    }
    return true;
}

四.运行测试

/**
 * 数组去重
 * @param array  
 * @return 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))

你可能感兴趣的:(javascript,算法,开发语言)