过滤包含对象数组

时间:2018-04-14 07:35:43

标签: javascript arrays reactjs

令人困惑的标题让我解释一下。

我有一系列类别和产品系列。

产品数组是一个对象数组,其中一个键是类别,它本身就是一个对象数组,其中一个感兴趣的键是标题。

类别数组也是一个对象数组。

我想过滤产品数组,只返回我所选类别的产品(设置状态)

我已经得到了这个,但它不起作用:

filterCategories = () => {
    return this.state.products.filter((product => {
      return product.categories.map((cat) => {
        cat.title == this.state.chosenCategory
      })
    }))
  }

这种方法似乎应该如此。据我所知,我通过映射每个产品来过滤产品数组,然后映射产品类别并检查类别标题是否等于状态中的标题。很明显我在某个地方出了问题。有谁能看到它?

示例数据:

products = [
 {
  id: '123',
  title: 'wine',
  categories: [
   {title: 'drinks'}
  ]
 }
]

categories = [
   {
  id: '123',
  title: 'drinks'
 }
]

2 个答案:

答案 0 :(得分:1)

看起来您想要测试类别标题的任何是否与selectedCategory匹配:因此,请使用some方法。此外,更好的是,如果您确定只有一个匹配类别,请使用.find代替filter。还要确保在内部函数的末尾返回一个值(您当前没有这样做),或者使用带隐式返回的箭头函数:

filterCategories = () => (
  this.state.products.find((product) => (
    product.categories.some(({ title }) => (
      title === this.state.chosenCategory
    ))
  ))
)

答案 1 :(得分:0)

过滤回调函数是一个谓词,用于测试数组的每个元素。你没有从内部地图函数返回任何东西,你必须在那里有一个过滤器,如

filterCategories = () => {
    return this.state.products.filter((product => {
      return product.categories.filter((cat) => {
        return cat.title == this.state.chosenCategory
      })
    }))
  }