【问题标题】:Compare two objects properties in JS比较 JS 中的两个对象属性
【发布时间】:2017-09-05 16:01:37
【问题描述】:

我需要比较两个对象,并找出缺少哪些属性。 这些对象相当大,有几个层次。

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

    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 = {};...

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

【问题讨论】:

  • 你会用这个比较做什么?我们可以根据您的需求帮助提供解决方案,而有关您的最终目标的更多信息将有所帮助。
  • 您希望这是 n 级检查吗?
  • 所以从服务器发送一个对象,并携带几个字符串用于html内容。如果缺少某些属性,我需要停止代码,显示错误页面,并显示所有缺少的属性

标签: javascript object


【解决方案1】:

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);

【讨论】:

    【解决方案2】:

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

    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);
    

    【讨论】:

    • 这段代码只会深入一层。示例数据有更多级别。
    • 没错,我没有注意到。会修改。谢谢!
    【解决方案3】:

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

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

    通过使用这种方法,你必须确保对象没有circular reference,否则JSON.stringify会抛出异常

    【讨论】:

    • 不,这不起作用,因为我需要知道缺少的属性。
    【解决方案4】:

    我在这里做了一个例子。希望它能解决你的问题。它将仅比较 Object 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);
    

    【讨论】:

      【解决方案5】:

      如果您的情况允许,我建议您使用 http://underscorejs.org/ 库,而不是滚动您自己的解决方案(或查看他们的实现)。在 JS 中,深度对象比较有时并非易事。 如果您决定推出自己的解决方案,您将递归地遍历属性并一一比较它们(忽略本机/内置对象属性,并且可能从某些原型继承)。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-01
        • 2021-05-08
        相关资源
        最近更新 更多