1

I'm Using React for the first time and I am trying to filter a JSON response so that I can display a list of products.

When I log the result of the filter to the console I seem to get the correct data. However when I try and map over it and render it ".Products" seems to be undefined.

enter image description here

import React, { useContext } from 'react';
import { MenuContext } from '../context/menuContext';

function Category() {
    const [categoryItems] = useContext(MenuContext);

    const category = categoryItems.filter(element => element.CategoryName == "Rice");

    console.log(category);

    return (

        <div>
            <h1>Category Page</h1>

            {category.Products.map(productItem => (
                <h3 key={productItem.Id}>{productItem.ProductName}</h3>

            ))}
        </div>
    );
}
export default Category;

Update: Thanks @Ori Drori for your comment. I have tried to use .find and still does not work.

I think this is something to do with how react works. Becuase in the console I am getting an empty output before I get the correct result.

Update 2: I implemented the answer that I have marked as correct and its now working. HOWEVER. There are two things I don't understand and I would like someone to explain.

  1. When I call

console.log(console.log(category);

Why is it that in the console I see 'undefined' before I get the result with the data.

enter image description here

  1. Why do I need to put 'category &&' when I remove it. It stops working.
1
  • 4
    Array.filter() returns an array of items, so the the Products are actually under. category[0].Products. Use Array.find() instead of a filter, because it returns only a single item. Commented Feb 15, 2022 at 19:19

2 Answers 2

1

category is a list, not a single object. The output of an Array.filter is always a list. That is why: category.Product is undefined.

If you want to find a category with the name Rice, you can change the code to:

import React, { useContext } from "react";
import { MenuContext } from "../context/menuContext";

function Category() {
  const [categoryItems] = useContext(MenuContext);

  const category = categoryItems.find(
    (element) => element.CategoryName === "Rice",
  ); // change `filter` to `find` and `==` to `===`

  console.log(category);

  return (
    <div>
      <h1>Category Page</h1>

      {category && // add this because category can be undefined
        category.Products.map((productItem) => (
          <h3 key={productItem.Id}>{productItem.ProductName}</h3>
        ))}
    </div>
  );
}
export default Category;

If it still does not work, show the error and also console.log category.Products

Sign up to request clarification or add additional context in comments.

Comments

1

When you used the method filter it returns as an array:

category.map(()=>)

or use the method to find the item product in category:

const find = category.find(elem=>elem.product)
find.map(()=>)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.