通过在嵌套的对象数组中查找多个条件来过滤数组
Posted
技术标签:
【中文标题】通过在嵌套的对象数组中查找多个条件来过滤数组【英文标题】:Filter array by finding multiple conditions in nested array of objects 【发布时间】:2022-01-23 03:39:43 【问题描述】:我有一个包含对象嵌套数组的数组,我想过滤嵌套数组的对象满足多个条件的数据。
这是示例数据。
const providerList = [
id: "bac4ef8d",
provider_name: 'Paa Ra'
provider_gender: "Male",
provider_item: [
itemID: "5911319b"
is_approved: true,
is_active: true,
,
itemID: "937a56d7"
is_approved: true,
is_active: true,
,
],
,
id: "9df373d5",
provider_name: "Che Ta",
provider_gender: "Female",
provider_item: [
itemID: "5911319b"
is_approved: true,
is_active: true,
],
]
这些是过滤器,注意itemID
可以有任意数量的元素。
const itemFilter =
itemID: ["5911319b", "937a56d7"],
is_approved: [true],
is_active: [true],
;
这是我的代码,但是输出没有按预期返回。
const filterProviders = providerList.filter(provider =>
provider.provider_item.every(item =>
Object.entries(itemFilter).every(([k, v]) => v.includes(item[k]))),
);
我需要过滤 providerList
并返回提供者
provier_item
匹配 itemFilter
中的所有值。上述itemFilter
的预期输出为:
filterProviders = [
id: "bac4ef8d",
provider_name: 'Paa Ra'
provider_gender: "Male",
provider_item: [
itemID: "5911319b"
is_approved: true,
is_active: true,
,
itemID: "937a56d7"
is_approved: true,
is_active: true,
,
],
]
【问题讨论】:
你能显示预期的输出吗? 您想要嵌套的provider_item
中的所有itemID
还是仅仅一部分?
@jsejcksn 我已更新以显示输出。
@NinaScholz 返回需要全部,而不是一些
【参考方案1】:
这就是你所追求的吗:
const providerList = [
id: "bac4ef8d",
provider_name: 'Paa Ra',
provider_gender: "Male",
provider_item: [
itemID: "5911319b",
is_approved: true,
is_active: true,
,
itemID: "937a56d7",
is_approved: true,
is_active: true,
]
,
id: "9df373d5",
provider_name: "Che Ta",
provider_gender: "Female",
provider_item: [
itemID: "5911319b",
is_approved: true,
is_active: true,
],
]
const itemFilter =
itemID: ["937a56d7", "5911319b"],
is_approved: [true],
is_active: [true],
const filterProviders = providerList.reduce((acc, provider) =>
provider.provider_item = provider.provider_item.filter(item => (
itemFilter.itemID.every(ai => provider.provider_item.map(i => i.itemID).includes(ai)) &&
itemFilter.is_approved.includes(item.is_approved) &&
itemFilter.is_active.includes(item.is_active)
))
let providerCount = provider.provider_item.length
if (providerCount > 0 && providerCount === itemFilter.itemID.length)
acc.push(provider)
return acc
, [])
console.log(filterProviders)
【讨论】:
谢谢,但是,如果我向 itemFilter 添加另一个itemID
,例如 itemID: ["937a56d7", "5911319b"
,我会得到两个结果,但是,我应该只提供名称“Paa Ra”。另一个名为“Che Ta”的用户没有itemID
,所以我不应该返回它
在我发帖时这条重要信息丢失了。我现在更新了我的答案。
有些东西没有加起来,对于提供者'Paa Ra',假设我们添加第三个provider_item
,其中is_active
和is_approved
等于true,在itemFilter
中@987654329 @ 没有被选择,那么我仍然得到 'Paa Ra' 的结果,这不应该是这种情况,它应该返回 null,因为 itemFilter.itemID
应该匹配 provider
数组中显示的内容
在这种情况下,您可以额外检查过滤的 providerList 是否与过滤器具有相同数量的提供程序。我再次更新了我的答案。以上是关于通过在嵌套的对象数组中查找多个条件来过滤数组的主要内容,如果未能解决你的问题,请参考以下文章