仅检查两个对象共有的属性。返回具有匹配属性值的每个对象[重复]
Posted
技术标签:
【中文标题】仅检查两个对象共有的属性。返回具有匹配属性值的每个对象[重复]【英文标题】:Check only the properties that two objects have in common. Return every object with matching property values [duplicate] 【发布时间】:2022-01-22 12:21:18 【问题描述】:我正在编写一个过滤器以仅显示基于关键字的某些元素。所以我有一个这种键/对格式的对象数组:
name: "Accounting (AAS) | Business, Design & Hospitality Pathway",
type: "associate of arts",
method: "clas-s-room based",
location: "centennial campus",
pathway: "business, design, & hospitality",
time: "4 semesters",
transfer: "transferable"
我有一个从单选按钮创建的对象。它被称为选定过滤器。如果只检查一个收音机,它将返回:
type: 'associate of arts'
如果检查了两个无线电:
type: 'associate of arts', method: 'hyflex class'
所以第二个对象没有第一个对象的所有属性。我需要检查他们确实具有的共同属性是否匹配。所以如果单选按钮创建的对象有两个属性。如果两个属性都匹配,我只希望对象返回。
我的 forEach 循环中有一个 if 语句。但只有在每个属性都匹配时才会返回。有人能找到解决方案,所以我只推送存在的属性匹配的对象吗?
data.forEach(function(el)
if (
el.type == selectedFilters.type &&
el.method == selectedFilters.method &&
el.location == selectedFilters.location &&
el.pathway == selectedFilters.pathway &&
el.time == selectedFilters.time &&
el.transfer == selectedFilters.transfer
)
result.push(el);
;
);
【问题讨论】:
也许这能让你走上正轨***.com/questions/34392741/… @VincentMenzel 那些正在返回匹配的键。我需要遍历我的第一个数组中的每个对象,并且只返回与我的“selectedFilters”对象中的所有键/值匹配的对象。 @VincentMenzel 谢谢!那确实回答了我的问题。其他人提出了类似的解决方案,但我认为这更简洁。 【参考方案1】:使用Object.entries()
和Array.every()
根据数据数组过滤来自无线电对象的条目
const radioObj =
A: 1,
C: 2
,
radioEntries = Object.entries(radioObj),
data = [
A: 1,
B: 3,
C: 2
,
A: 2,
B: 2,
C:2
]
const res = data.filter(e => radioEntries.every(([k,v]) => e[k] === v))
console.log(res)
【讨论】:
【参考方案2】:首先,单选按钮只有一个可能的选择。您正在寻找复选框。
现在,如果我正确理解了您的问题,那么您就错了,因为您总是在检查候选对象中的每个属性。您需要做的是遍历“您从单选按钮创建的对象”(在我的示例代码中为selectedFilters
),检查每个 那些 属性的值是否等于你的候选对象。
这是一个例子:
let objs = [
name: "Accounting (AAS) | Business, Design & Hospitality Pathway",
type: "associate of arts",
method: "clas-s-room based",
location: "centennial campus",
pathway: "business, design, & hospitality",
time: "4 semesters",
transfer: "transferable"
,
name: "Accounting (AAS) | Business, Design & Hospitality Pathway",
type: "associate of arts",
method: "clas-s-room based",
location: "centennial campus",
pathway: "art, music and history",
time: "4 semesters",
transfer: "transferable"
,
name: "Accounting (AAS) | Business, Design & Hospitality Pathway",
type: "associate of science",
method: "clas-s-room based",
location: "centennial campus",
pathway: "business, design, & hospitality",
time: "4 semesters",
transfer: "transferable"
,
]
let selectedFilters =
type: "associate of arts",
method: "clas-s-room based",
function checkObj(obj, selectedFilters)
for (x in selectedFilters)
if (obj[x] !== selectedFilters[x]) return false;
return true;
let result = [];
for (obj of objs)
if (checkObj(obj, selectedFilters)) result.push(obj)
console.log(result);
在测试中,我使用selectedFilters
和两个选定的属性。在数组中的对象中,不应选择第三个,因为type
属性不同。因此,checkObj
函数只运行selectedFilters
属性并将它们与传入的对象进行比较。由于它正在迭代检查对象,它会忽略检查对象没有的任何属性。
因此,您遍历候选对象数组,为每个对象调用objCheck
函数。每当函数返回 true 时(因为 selectedFilters
中的所有属性都匹配候选对象中的相同属性,忽略 selectedFilters
中没有的任何属性),该对象被推入结果数组。
【讨论】:
这很接近,但它似乎不适用于对象检查的两个属性。我明白你对复选框的意思。但在这种情况下,我有多个下拉菜单。因此可以检查多个单选按钮进行过滤。 @phuzisham 哪两个属性?【参考方案3】:你可以像这样映射对象
const data = [
name: "Accounting (AAS) | Business, Design & Hospitality Pathway",
type: "associate of arts",
method: "clas-s-room based",
location: "centennial campus",
pathway: "business, design, & hospitality",
time: "4 semesters",
transfer: "transferable"
]
const selectedFilters =
type: 'associate of arts',
transfer: "transferable"
const res = data.reduce((acc, entry) =>
// for each key in filter check if the value of the entry matches the filter value
// only do the check if the filter value has not been set to false
// if all filter values pass push the object, else just return the original array
return Object
.keys( selectedFilters )
.reduce( ( ok, key ) =>
return ok ? selectedFilters[key] === entry[key] : false;
, true ) ? acc.concat( entry ) : acc;
, [])
console.log(res);
【讨论】:
以上是关于仅检查两个对象共有的属性。返回具有匹配属性值的每个对象[重复]的主要内容,如果未能解决你的问题,请参考以下文章