通过在嵌套的对象数组中查找多个条件来过滤数组

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_activeis_approved 等于true,在itemFilter 中@987654329 @ 没有被选择,那么我仍然得到 'Paa Ra' 的结果,这不应该是这种情况,它应该返回 null,因为 itemFilter.itemID 应该匹配 provider 数组中显示的内容 在这种情况下,您可以额外检查过滤的 providerList 是否与过滤器具有相同数量的提供程序。我再次更新了我的答案。

以上是关于通过在嵌套的对象数组中查找多个条件来过滤数组的主要内容,如果未能解决你的问题,请参考以下文章

通过搜索嵌套对象属性过滤对象数组

typescript 通过嵌套数组值过滤对象数组

从嵌套数组对象中查找对象

javascript 过滤具有多个条件的对象数组。

如何在JavaScript中过滤嵌套数组中的对象?

在 Typescript 中过滤嵌套数组对象的数组