比较JS中的两个对象属性

时间:2017-09-05 16:01:38

标签: javascript object

我需要比较两个对象,并找出缺少的属性。 对象相当大,有几个级别。

我将给出对象类型的简短示例:

    UC = {};
    UC.start = {}
    UC.start.enableHardEccDecline = '';
    UC.start.template = {};
    UC.start.template.ecc = '';
    UC.start.template.decline = {};
    UC.start.template.decline.title = '';
    UC.start.template.decline.body = '';
    UC.general = {};...

所以这是一个示例对象。我需要比较的只是属性。我不在乎价值。我将把这个对象与另一个非常相似的对象进行比较,但是有些属性可能会丢失。

5 个答案:

答案 0 :(得分:3)



function compare(base, compared, deepSearch) {
  var missing = [];

  var compareProp = function (baseValue, comparedValue, path, deepSearch) {
    //console.log('comparing', path.join('.'));

    if (comparedValue === undefined) {
      console.log('missing key', path.join('.'));

        if (!deepSearch) {
          return;
        }
    }

    if (typeof baseValue === 'object') {
      Object.keys(baseValue).forEach(function (key) {
        compareProp(baseValue [key], comparedValue && comparedValue [key], path.concat(key), deepSearch);
      }); 
    }
  };

  Object.keys(base).forEach(function (key) {
    compareProp(base [key], compared [key], [key], deepSearch);
  });
}

UC = {};
UC.start = {}
UC.start.enableHardEccDecline = '';
UC.start.template = {};
UC.start.template.ecc = '';
UC.start.template.decline = {};
UC.start.template.decline.title = '';
UC.start.template.decline.body = '';
UC.general = {};

compare (UC, {}, true);




答案 1 :(得分:0)

我刚刚在这里做了一个简单的例子,不确定你想要如何应用它,但我已将缺少的项目添加到数组中,该数组正在记录它。

Obj1应该是您的标准比较对象,obj2是从请求中收到的对象。

var obj1 = {};
obj1.test1 = 0;
obj1.test2 = 0;
obj1.test2222 = 0;
obj1.testLoremIpsum = 0;
obj1.lalala = 0;

var obj2 = {};
obj2.test1 = 0;
obj2.test25 = 0;
obj2.lalala1 = 0;

var k , i = 0;
var missingProps = [];

for( i in obj1 )
{
    var isFound = false;
    for( k in obj2) if( i == k ) isFound = true;
    if(!isFound) missingProps.push( i );
}
console.log(missingProps);

答案 2 :(得分:0)

如何使用JSON.stringify将对象转换为字符串,然后进行字符串比较:

JSON.stringify(UC) === JSON.stringify(UCToBeCompared)

使用此方法,您必须确保对象不具有circular reference,否则JSON.stringify会抛出异常

答案 3 :(得分:-1)

我在这里做了一个例子。希望它能解决您的问题。它将仅比较对象KEYS,并返回与比较对象不存在的对象密钥。

var a = Object.keys(obj1);
var b = Object.keys(obj2);

var missing= a.filter(function(v){
    return b.indexOf(v)==-1;
})

console.log(missing);

答案 4 :(得分:-2)

如果您的情况允许,我建议使用http://underscorejs.org/库,而不是滚动您自己的解决方案(或查看其实现)。在JS深层对象比较有时并不简单。 如果您决定推出自己的解决方案,则会递归遍历属性并逐个进行比较(忽略本机/内置对象属性,并且可能从某些原型继承)。

如果你愿意,我很乐意详细说明。