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,用于记录中间的每一行。我去掉了这个,把答案简化了一点