在JavaScript中,要判断复制出来的对象与原始对象相比有哪些属性被修改了,你可以使用几种不同的方法。以下是一些常见的方法:
-
使用
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('对象没有被修改'); }
-
使用
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('没有属性被修改'); }
-
使用
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} 被修改了`); } }
-
使用
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)} 被修改了`); } });
-
使用第三方库:
如果需要更复杂的比较逻辑,例如深度比较或比较数组和函数,可以使用像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('没有属性被修改'); }
选择哪种方法取决于你的具体需求,例如是否需要深度比较、是否包含复杂数据类型等。
如果这篇文章对你有所帮助,欢迎点赞、分享和留言,让更多的人受益。感谢你的细心阅读,如果你发现了任何错误或需要补充的地方,请随时告诉我,我会尽快处理。