【问题标题】: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 返回需要全部,而不是一些

标签: javascript arrays reactjs filter javascript-objects


【解决方案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 是否与过滤器具有相同数量的提供程序。我再次更新了我的答案。
猜你喜欢
  • 2020-09-17
  • 2020-08-04
  • 2021-04-16
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
  • 1970-01-01
  • 2021-10-23
  • 2019-05-22
相关资源
最近更新 更多