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

Javascript 如何比较和匹配两个不同对象的对象关键点?,javascript,loops,object,Javascript,Loops,Object,以下面两个对象为例 filterForm = {'claim_number': null, 'status': 'approved', 'patient': null, 'service_date': null} this.rows = [ { "claim_number": '6632224-3', 'patient': 'Janine Soprano', 'allowed_amount':'$100', 'service': 'medical', 'status': 'approved'

以下面两个对象为例

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

this.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'}
如何循环使用this.rows并检查它的对象键与FilterPerform的键匹配?我看过一篇关于检查一个对象是否与另一个对象完全匹配的帖子,但我只感兴趣的是通过循环对象来检查哪些键匹配


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

您可以使用
对象。键
获取
过滤器执行
键:

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

Fiddle:

您可以使用
Object.keys
获取您的
过滤器执行
键:

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]);
        }
    });
});
Fiddle:

您可以使用和新对象来获取唯一的键,同时还可以保持代码的简短和可读性

// Get an array of filterForm's keys
const filterFormKeys = Object.keys(filterForm);

// Get a flattened array of this.rows' keys
const rowKeys = this.rows.flatMap(item => Object.keys(item));

// Get keys that exist in both arrays using Array.filter
const existingKeys = rowKeys.filter(key => filterFormKeys.includes(key));

// Use the Set object to get unique keys out of existingKeys
const uniqueExistingKeys = [...new Set(existingKeys)];

console.log(uniqueExistingKeys)
下面是一个示例(打开控制台)

注意:您也可以使用
过滤器
而不是
设置

const uniqueExistingKeys = existingKeys.filter((value, index) =>
    existingKeys.indexOf(value) === index);
我选择Set是因为它更简洁。 这一切都取决于您:)

您可以使用新对象来获取唯一的密钥,同时保持代码简短易读

// Get an array of filterForm's keys
const filterFormKeys = Object.keys(filterForm);

// Get a flattened array of this.rows' keys
const rowKeys = this.rows.flatMap(item => Object.keys(item));

// Get keys that exist in both arrays using Array.filter
const existingKeys = rowKeys.filter(key => filterFormKeys.includes(key));

// Use the Set object to get unique keys out of existingKeys
const uniqueExistingKeys = [...new Set(existingKeys)];

console.log(uniqueExistingKeys)
下面是一个示例(打开控制台)

注意:您也可以使用
过滤器
而不是
设置

const uniqueExistingKeys = existingKeys.filter((value, index) =>
    existingKeys.indexOf(value) === index);
我选择Set是因为它更简洁。
这一切都取决于您:)

下面是一个如何找到匹配键的简单示例。这样做的目的如下:

  • 使用获取
    filter\u表单
  • 使用创建这些键中的一个,以便快速查找
  • 在行中循环。
  • 对于每一行,以与上述相同的方式获取键
  • 用于过滤掉
    过滤密钥中存在的密钥
  • var筛选表单、行、筛选键、结果;
    筛选表格={'claim_number':null,'status':'approved','patient':null,'service_date':null};
    行=[
    {‘索赔编号’:‘6632224-3’,‘患者’:‘Janine Soprano’,‘允许金额’:‘100美元’,‘服务’:‘医疗’,‘状态’:‘批准’,‘提供者’:‘Sam Smith’},
    {‘索赔编号’:‘3218458-0’,‘患者’:‘萨玛莎·斯诺’,‘允许金额’:‘1100美元’,‘服务’:‘医疗’,‘状态’:‘批准’,‘提供者’:‘约翰·史密斯’}
    ];
    filter_keys=新集合(Object.keys(filter_form));
    结果=rows.map(row=>Object.keys(row.filter)(key=>filter\u keys.has(key));
    
    控制台日志(结果)下面是一个如何查找匹配键的简单示例。这样做的目的如下:

  • 使用获取
    filter\u表单
  • 使用创建这些键中的一个,以便快速查找
  • 在行中循环。
  • 对于每一行,以与上述相同的方式获取键
  • 用于过滤掉
    过滤密钥中存在的密钥
  • var筛选表单、行、筛选键、结果;
    筛选表格={'claim_number':null,'status':'approved','patient':null,'service_date':null};
    行=[
    {‘索赔编号’:‘6632224-3’,‘患者’:‘Janine Soprano’,‘允许金额’:‘100美元’,‘服务’:‘医疗’,‘状态’:‘批准’,‘提供者’:‘Sam Smith’},
    {‘索赔编号’:‘3218458-0’,‘患者’:‘萨玛莎·斯诺’,‘允许金额’:‘1100美元’,‘服务’:‘医疗’,‘状态’:‘批准’,‘提供者’:‘约翰·史密斯’}
    ];
    filter_keys=新集合(Object.keys(filter_form));
    结果=rows.map(row=>Object.keys(row.filter)(key=>filter\u keys.has(key));
    

    控制台日志(结果)
    使用
    Object.keys
    获取给定对象键的数组。。然后循环你的对象数组并逐个检查。我曾经尝试过这样做,但它总是返回false。如果你能给我一个工作示例,我将不胜感激。@London804-更好的是,如果你发布代码,我们可以告诉你哪里出错了。如果FilterPerform的所有属性都为null,会发生什么?如果FilterPerform中的两个或多个字段都有值,该怎么办?使用
    Object.keys
    获取给定对象键的数组。。然后循环你的对象数组并逐个检查。我曾经尝试过这样做,但它总是返回false。如果你能给我一个工作示例,我将不胜感激。@London804-更好的是,如果你发布代码,我们可以告诉你哪里出错了。如果FilterPerform的所有属性都为null,会发生什么?如果filterForm中的两个或多个字段都有值,该怎么办?您的代码非常清楚,但我认为我不能使用它,因为.flatMap()是实验性的。我正在使用Angular CLI,得到错误类型错误:this.rows.flatMap不是function@London804如果您使用的是
    lodash
    ,则有。另外,还有一个可以用来使用Array.flatMap的函数。@London804另外,值得注意的是,尽管.flatMap()是实验性的,但它的应用非常广泛。:)您的代码非常清楚,但我认为我不能使用它,因为.flatMap()是实验性的。我正在使用Angular CLI,得到错误类型错误:this.rows.flatMap不是function@London804如果您使用的是
    lodash
    ,则有。另外,还有一个可以用来使用Array.flatMap的函数。@London804另外,值得注意的是,尽管.flatMap()是实验性的,但它的应用非常广泛。:).log()是什么?而且,我的console.log似乎不起作用,因为结果只返回五个空数组。我还尝试了第二个版本,匹配的_键返回一个空数组。@London804,用于记录中间的每一行。我去掉了那个部分,把答案简化了一点。检查它现在是否工作,如果不工作,我很好奇你正在使用哪个浏览器。您的浏览器可能没有或。什么是.log()?而且,我的console.log似乎不起作用,因为结果只返回五个空数组。我还尝试了第二个版本,匹配的_键返回一个空数组。@London804,用于记录中间的每一行。我去掉了这个,把答案简化了一点