如何比较和匹配两个不同对象的对象键?

时间:2018-12-03 21:40:34

标签: javascript loops object

获取以下两个对象。

gui.display()

如何循环遍历this.rows并检查其中哪个对象键与filterForm的键匹配?我看过有关检查一个对象是否完全匹配另一个对象的文章,但是我只想循环遍历该对象以检查哪些键匹配。

随后,一旦我确定哪些键匹配,那么如何检查哪些值匹配?

3 个答案:

答案 0 :(得分:2)

您可以使用Object.keys来获取filterForm密钥:

let availableKeys = Object.keys(filterForm);

然后,您需要循环this.rows并找到上述数组中包含的所有键:

this.rows.forEach(row => {
    let rowKeys = Object.keys(row);
    let matchingRowKeys = availableKeys.filter(k => rowKeys.indexOf(k) > -1);

    //If you then want to check if the values match
    matchingRowKeys.forEach(rk => {
        if (row[rk] === filterForm[rk]) {
            //matching value
            console.log("Found matching key/value", rk, row[rk]);
        }
    });
});

提琴:http://jsfiddle.net/2nw3fg0d/

答案 1 :(得分:1)

这是如何找到匹配键的简单示例。这将执行以下操作:

  1. 使用Object.keys()获取filter_form键。
  2. 创建其中的Set个键,以便使用Set.has()进行快速查找。
  3. 遍历行。
    1. 对于每一行,以与上述相同的方式获取键。
    2. 使用Array.filter()过滤掉filter_keys中存在的密钥。

var filter_form, rows, filter_keys, result;

filter_form = { 'claim_number': null, 'status': 'approved', 'patient': null, 'service_date': null };

rows = [
  { 'claim_number': '6632224-3', 'patient': 'Janine Soprano', 'allowed_amount': '$100', 'service': 'medical', 'status': 'approved', 'provider': 'Sam Smith' },
  { 'claim_number': '3218458-0', 'patient': 'Samatha Snow', 'allowed_amount': '$1100', 'service': 'medical', 'status': 'approved', 'provider': 'John Smith' }
];

filter_keys = new Set(Object.keys(filter_form));
result = rows.map(row => Object.keys(row).filter(key => filter_keys.has(key)));

console.log(result);

此答案使用 Set 实例快速查找键。如果您不想使用集,请替换以下部分。

filter_keys = new Set(Object.keys(filter_form))
// with
filter_keys = Object.keys(filter_form)

key => filter_keys.has(key)
// with 
key => filter_keys.indexOf(key) !== -1

如果您对映射不感兴趣,但想使用当前迭代中的匹配键,请使用:

let filter_keys = new Set(Object.keys(filter_form));
rows.forEach(row => {
  let matching_keys = Object.keys(row).filter(key => filter_keys.has(key));
  // ...
});

答案 2 :(得分:0)

您可以使用flatMapArray.filter()和新的Set对象来获取唯一键,同时还可以使代码简短易读。

filter

这里是一个带有示例的jsfiddle(打开控制台)。

注意:您也可以使用Set代替const uniqueExistingKeys = existingKeys.filter((value, index) => existingKeys.indexOf(value) === index);

/* Sample data:

[{
  "bhp": 354,
  "model": "a45",
  "make": "mercedes"
}, {
  "model": "m4",
  "make": "bmw"
}]

*/ 

xhr = new XMLHttpRequest();

xhr.open('GET', 'https://api.myjson.com/bins/1cjhoe');
xhr.onload = function() {
  var cars = JSON.parse(xhr.responseText);
  if (xhr.status === 200) {
    populate(cars);
  } else {
    console.log('Request failed. Returned status of ' + xhr.status);
  }
};

xhr.send();

function populate(cars) {
  var list = document.getElementById('list');

  cars.forEach(function(car) {
    var carDiv = document.createElement('div');
    carDiv.className = 'car';

    if (car.make) { carDiv.innerHTML = '<div>' + car.make + ' </div>'; }
    if (car.model) { carDiv.innerHTML += '<div>' + car.model + ' </div>'};
    if (car.bhp) { carDiv.innerHTML += '<div>' + car.bhp + ' </div>'; }

    list.appendChild(carDiv);
  });
}

我选择Set是因为它更简洁。 这完全取决于您:)