比较两个对象中存在的属性

时间:2015-12-04 09:39:17

标签: javascript object underscore.js

我有两个对象:

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

var b = {
  world: 'Koko'
}

如何只比较两个对象中存在的属性?在我的例子中,它将是属性" world"。

2 个答案:

答案 0 :(得分:5)

使用下划线:

您可以获取两个对象的键(使用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>

使用vanilla 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),然后通过键阵列进行另一次迭代以找到交集,然后在比较之前再次遍历交叉点。

答案 1 :(得分:0)

如果你使用下划线Js,那对你来说很容易。 Underscore有一个方法(_。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.
});