如何在JavaScript中对比新旧对象并返回值不同的新属性
对比新旧对象属性差异并返回新对象差异属性的解决方案
你想要对比新旧两个对象,提取出新对象中与旧对象属性值不同的部分,对吧?你已经尝试用Lodash写了一段代码,但还没得到预期的结果,我来帮你解决这个问题。
方案1:修正你的Lodash实现
你的代码逻辑本身是没问题的,大概率是没有正确引入Lodash库导致的。先确保你已经在项目中引入了Lodash(比如通过CDN引入或者npm安装),然后测试下面的代码:
var new_pkg ={scooter_id:"TM0060",lat:"45.747646",lng:"21.231496",alt:"99.200"}; var old_pkg={scooter_id:"TM0060",lat:"25.747746",lng:"31.221496",alt:"100.200"}; function difference(newObj, oldObj) { function changes(newObj, oldObj) { return _.transform(newObj, function(result, value, key) { // 对比当前属性值与旧对象对应属性值是否相等 if (!_.isEqual(value, oldObj[key])) { // 若都是对象则递归处理嵌套结构,否则直接赋值新对象的属性值 result[key] = _.isObject(value) && _.isObject(oldObj[key]) ? changes(value, oldObj[key]) : value; } }); } return changes(newObj, oldObj); } console.log(difference(new_pkg, old_pkg)); // 输出结果:{ lat: '45.747646', lng: '21.231496', alt: '99.200' }
这段代码会遍历新对象的每个属性,用_.isEqual精准对比新旧属性值(能处理复杂类型的对比),不等的属性就会被保留到结果中,嵌套对象也能递归处理。
方案2:原生JavaScript实现(不依赖第三方库)
如果你不想依赖Lodash,也可以用原生JS写一个功能相同的函数,无需额外引入库:
var new_pkg ={scooter_id:"TM0060",lat:"45.747646",lng:"21.231496",alt:"99.200"}; var old_pkg={scooter_id:"TM0060",lat:"25.747746",lng:"31.221496",alt:"100.200"}; function getObjectDiff(newObj, oldObj) { const diff = {}; // 遍历新对象的所有可枚举属性 for (const key in newObj) { // 检查旧对象是否包含该属性,且属性值不同 if (newObj[key] !== oldObj[key]) { // 处理嵌套对象(排除数组和null的情况) const isNewObj = typeof newObj[key] === 'object' && newObj[key] !== null && !Array.isArray(newObj[key]); const isOldObj = typeof oldObj[key] === 'object' && oldObj[key] !== null && !Array.isArray(oldObj[key]); if (isNewObj && isOldObj) { const nestedDiff = getObjectDiff(newObj[key], oldObj[key]); // 只有嵌套对象存在差异时,才添加到结果中 if (Object.keys(nestedDiff).length > 0) { diff[key] = nestedDiff; } } else { diff[key] = newObj[key]; } } } return diff; } console.log(getObjectDiff(new_pkg, old_pkg)); // 输出结果:{ lat: '45.747646', lng: '21.231496', alt: '99.200' }
这个原生版本不仅能处理你的简单对象场景,还支持嵌套对象的差异对比,同时避免了对数组和null的误判。
内容的提问来源于stack exchange,提问作者florinstefan8830
相关产品推荐
相关产品推荐

