You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:00:01