代码之家  ›  专栏  ›  技术社区  ›  The Walrus

过滤包含对象数组的对象数组

  •  1
  • The Walrus  · 技术社区  · 8 年前

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

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

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

    类别数组也是对象数组。

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

    我有这个,但它不起作用:

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

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

    示例数据:

    products = [
     {
      id: '123',
      title: 'wine',
      categories: [
       {title: 'drinks'}
      ]
     }
    ]
    
    categories = [
       {
      id: '123',
      title: 'drinks'
     }
    ]
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   CertainPerformance    8 年前

    看起来你想测试一下 任何 类别标题中有个与chosenCategory匹配:因此,请使用 some 方法此外,更好的是,如果您确定只有一个匹配的类别,请使用 .find 而不是 filter 。还要确保在内部函数末尾返回一个值(当前未执行此操作),或使用带隐式返回的箭头函数:

    filterCategories = () => (
      this.state.products.find((product) => (
        product.categories.some(({ title }) => (
          title === this.state.chosenCategory
        ))
      ))
    )
    
        2
  •  0
  •   Shubham Khatri    8 年前

    过滤器回调函数是一个谓词,用于测试数组的每个元素。您也没有从内部映射函数返回任何内容,您必须在那里有一个过滤器,如

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