【问题标题】:Compare properties that exist in both objects比较两个对象中存在的属性
【发布时间】:2015-12-04 09:39:17
【问题描述】:

我有两个对象:

var a = {
  world: 'Mamba',
  planet: 'Oliver'
}

var b = {
  world: 'Koko'
}

如何仅比较两个对象中存在的那些属性?在我的示例中,它将是属性“world”。

【问题讨论】:

    标签: javascript object underscore.js


    【解决方案1】:

    使用下划线:

    您可以获取两个对象的键(使用Object.keys),对它们进行交集(使用_.intersect)并遍历它们并进行比较:

    var keys1 = Object.keys(a);
    var keys2 = Object.keys(b);
    
    var common = _.intersection(keys1, keys2);
    
    common.forEach(function(key) {
        if(a[key] === b[key]) { 
           // they are equal 
        }
    });
    

    演示

    var a = {
      world: 'Mamba',
      planet: 'Oliver',
      test: 'x'
    };
    
    var b = {
      world: 'Koko',
      test: 'x'
    };
    
    var keys1 = Object.keys(a);
    var keys2 = Object.keys(b);
    
    var common = _.intersection(keys1, keys2);
    
    var list = document.getElementById('list');
    common.forEach(function(c) {
      list.innerHTML += ('<li id=' + c + '>' + c + '</li>');
    });
    
    common.forEach(function(key) {
    
      var elem = document.getElementById(key);
      if (a[key] === b[key]) {
        elem.innerHTML += ' [equal]';
      } else {
         elem.innerHTML += ' [not equal]';  
      }
    });
    <script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
    <h3>Common Properties</h3>
    <ul id="list">
      <ul>

    使用原版 JS:

    你可以遍历a的所有属性,检查它是否存在于b中,然后比较:

    for(var prop in a) {
        if(a.hasOwnProperty(prop) && b.hasOwnProperty(prop) && a[prop] === b[prop]) {
            // they are equal
        }
    }
    

    注意:使用hasOwnProperty 不包括通过原型提供的属性。

    演示

    var a = {
      world: 'Mamba',
      planet: 'Oliver',
      test: 'x'
    };
    
    var b = {
      world: 'Koko',
      test: 'x'
    };
    
    var list = document.getElementById('list');
    for (var prop in a) {
      
      if (a.hasOwnProperty(prop) && b.hasOwnProperty(prop)) {
      
        list.innerHTML += '<li id="' + prop + '">' + prop + '</li>';
    
        var elem = document.getElementById(prop);
        if (a[prop] === b[prop]) {
          elem.innerHTML += ' [equal]';
        } else {
          elem.innerHTML += ' [not equal]';
        }
      }
    }
    <h3>Common Properties</h3>
    <ul id="list">
    
    </ul>

    vanilla JS 方式在运行时间方面更高效

    原因是它只迭代a 的属性一次。

    下划线方式需要获取对象键(需要iteration over each object),然后通过键数组再次迭代找到交集,然后在比较之前再次遍历交集。

    【讨论】:

      【解决方案2】:

      如果你使用下划线Js,对你来说会很容易。下划线有一个迭代对象或数组的方法(_.intersection)。

       var intersection=_.intersection(keys(a),keys(b));
       console.log(intersection);  // ["world"]
       $.each(intersection,function(index,value){
         if(a[value] == b[value])
           //write your code
      });
      

      否则先找到对象的交集,然后迭代匹配的数组以匹配相关值。

      var a = {
        world: 'Mamba',
        planet: 'Oliver'
      }
      
      var b = {
        world: 'Koko'
      }
      var arr = [];
      
      // Find the matched keys in array(Intersection of keys)
      
      $.each(Object.keys(a), function(index1, value1) {
        $.each(Object.keys(b), function(index2, value2) {
          if (value1 == value2)
            arr.push(value1)
        });
      
      });
      
      //Then iterate over array of keys to find matched value.
      
      $.each(arr, function(index, value) {
        if (a[value] == b[value])
        // write your code.
      });
      

      【讨论】:

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