首页 > 解决方案 > 比较对象并删除相等的值

问题描述

我希望能够比较两个对象并删除值未更改的属性。

prevObject = {
  isActive: true,
  userName: 'Patric',
  settings: {
    isUser: true
  }
}


nextObject = {
  isActive: true,
  userName: 'Patric Surname',
  settings: {
    isUser: false
  }
}

上面比较的结果应该是:

{
  userName: 'Patric Surname',
  settings: {
    isUser: false
  }
}

我已经尝试了一些 for in 循环等,但我还没有让它递归地工作。抱歉,我没有任何代码可以证明我已经尝试过了。我把它扔了,因为我有点沮丧。我也坚持使用纯 ES5。所以没有lodash或下划线:)

会很高兴得到一些帮助!

标签: javascriptecmascript-5

解决方案


您将需要一种递归方法:

在 ECMAScript-5 语法中:

function isObject(a) {
    return typeof a === "object" && a;
}

function diff(a, b) {
    var res = b instanceof Array ? [] : {};
    for (var prop in b) {
        if (!(prop in a) || (!isObject(a[prop]) || !isObject(b[prop])) && a[prop] !== b[prop]) {
            res[prop] = b[prop];
        } else {
            var obj = diff(a[prop], b[prop]);
            // If the recursive result is not an empty object, then use it
            for (var _ in obj) {
                res[prop] = obj;
                break; // We only need 1 iteration
            }
        }
    }
    return res; 
}

var prevObject = {isActive: true,userName: 'Patric',settings: {isUser: true }};
var nextObject = { isActive: true,userName: 'Patric Surname',settings: {isUser: false}};

console.log(diff(prevObject, nextObject));

此函数对数组的支持有限。只有当它们的内容和它们在数组中出现的索引相同时,数组元素才被认为是相同的。这意味着结果数组可能有间隙(“稀疏”)。


推荐阅读