在JavaScript中,要判断复制出来的对象与原始对象相比有哪些属性被修改

在JavaScript中,要判断复制出来的对象与原始对象相比有哪些属性被修改了,你可以使用几种不同的方法。以下是一些常见的方法:

  1. 使用JSON.stringify:
    这种方法适用于属性值是基本数据类型的情况。通过将两个对象序列化为JSON字符串,然后比较这两个字符串,可以快速判断对象是否发生了变化。

    const original = { a: 1, b: 2 };
    const copied = { ...original, b: 3 };
    
    const originalString = JSON.stringify(original);
    const copiedString = JSON.stringify(copied);
    
    if (originalString !== copiedString) {
      console.log('对象被修改了');
    } else {
      console.log('对象没有被修改');
    }
    
  2. 使用Object.keys和比较:
    如果对象属性的值是对象或数组等复杂类型,JSON.stringify可能不会反映真实的差异。这时可以使用Object.keys来遍历对象的键,并逐个比较属性值。

    const original = { a: 1, b: { c: 3 } };
    const copied = { ...original, b: { ...original.b, c: 4 } };
    
    const keys = Object.keys(copied);
    let modified = false;
    
    keys.forEach(key => {
      if (JSON.stringify(original[key], Object.keys(original[key]), 2) !==
          JSON.stringify(copied[key], Object.keys(copied[key]), 2)) {
        console.log(`属性 ${key} 被修改了`);
        modified = true;
      }
    });
    
    if (!modified) {
      console.log('没有属性被修改');
    }
    
  3. 使用Object.entries:
    Object.keys类似,Object.entries返回一个给定对象自身可枚举属性的键值对数组。

    const original = { a: 1, b: 2 };
    const copied = { ...original, a: 3 };
    
    for (const [key, value] of Object.entries(copied)) {
      if (original[key] !== value) {
        console.log(`属性 ${key} 被修改了`);
      }
    }
    
  4. 使用Reflect.ownKeys:
    如果你需要包括Symbol类型的键,可以使用Reflect.ownKeys代替Object.keys

    const original = { a: 1, [Symbol('b')]: 2 };
    const copied = { ...original, a: 3 };
    
    Reflect.ownKeys(copied).forEach(key => {
      if (original[key] !== copied[key]) {
        console.log(`属性 ${String(key)} 被修改了`);
      }
    });
    
  5. 使用第三方库:
    如果需要更复杂的比较逻辑,例如深度比较或比较数组和函数,可以使用像lodash这样的第三方库。

    const _ = require('lodash');
    
    const original = { a: 1, b: [2, 3] };
    const copied = { ...original, b: [2, 4] };
    
    const differences = _.transform(
      _.differenceWith(_.entries(copied), _.entries(original), _.isEqual),
      (result, [key, value]) => {
        result.push(key);
      }, []
    );
    
    if (differences.length > 0) {
      console.log(`以下属性被修改了:${differences.join(', ')}`);
    } else {
      console.log('没有属性被修改');
    }
    

选择哪种方法取决于你的具体需求,例如是否需要深度比较、是否包含复杂数据类型等。

如果这篇文章对你有所帮助,欢迎点赞、分享和留言,让更多的人受益。感谢你的细心阅读,如果你发现了任何错误或需要补充的地方,请随时告诉我,我会尽快处理。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值