手写javascript函数实现对象数组去重

需求:只要对象内的属性长度一样,且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);

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值