shanksu 218
shanksu 218

Reputation: 195

React map() multidimensional array

how to map thorugh a multidimantional array in react?. this method is working fine with a simple but the output is not showing with this type of array. there is no error message as well.

two 'category' divs appear in the page but they are empty the content is not showing.my desired out come is:

<div className="category">
        <h3>Gadgets</h3>
        <a href={`/categorypage`} className='sub-category'>
            <img src='/assets/images/iphone.png' alt="" />
            <p className='name'>iphone</p>
        </a>
        <a href={`/categorypage`} className='sub-category'>
            <img src='/assets/images/samsung.jpg' alt="" />
            <p className='name'>samsung</p>
        </a>
    </div>

    <div className="category">
        <h3>Books</h3>
        <a href={`/categorypage`} className='sub-category'>
            <img src='/assets/images/book-1.jpg' alt="" />
            <p className='name'>Fiction</p>
        </a>
        <a href={`/categorypage`} className='sub-category'>
            <img src='/assets/images/book-2.jpg' alt="" />
            <p className='name'>education</p>
        </a>
    </div>

array:

const Categories = [
{
    'Gadgets': [
        {
            'name': 'iphone',
            'image': '/assets/images/iphone.png',
        },
        {
            'name': 'samsung',
            'image': '/assets/images/samsung.jpg',
        },
    ]
},
{
    'Books': [
        {
            'name': 'Fiction',
            'image': '/assets/images/book-1.jpg',
        },
        {
            'name': 'education',
            'image': '/assets/images/book-2.jpg',
        },
    ]
}

]

export default Categories

category.js:

function Category({ category }) {
return (
    <div className="category">
        <h3>{category.category}</h3>
        <a href={`/categorypage`} className='sub-category'>
            <img src={category.image} alt="" />
            <p className='name'>{category.name}</p>
        </a>
    </div>
)

}

app.js:

{Categories.map((category, i) => (
    <Category category={category} />
 ))}





    

Upvotes: 0

Views: 968

Answers (1)

Hassan Imam
Hassan Imam

Reputation: 22574

You have an array of objects. When you iterate through categories, you get an object of category. You have to extract the key and values using Object.entries() and then use array#map to show all values inside it.

const { useState, Fragment } = React;

function Category({ category }) {
  return (
    <div className="category">
      {
        Object.entries(category).map(([categoryName, values]) => {
         return (
            <Fragment>
            <h3>{categoryName}</h3>
            <Fragment>
            {values.map(({image, name}) => (
                <Fragment>
                <a href={`/categorypage`} className='sub-category'>
                    <img src={image} alt="" />
                    <p className='name'>{name}</p>
                </a>
                </Fragment>
            ))}
            </Fragment>
            </Fragment>
          )
        })
      }
    </div>
  )
}

const App = () => {
  const categories = [{ 'Gadgets': [ { 'name': 'iphone', 'image': '/assets/images/iphone.png', }, { 'name': 'samsung', 'image': '/assets/images/samsung.jpg', }, ] }, { 'Books': [ { 'name': 'Fiction', 'image': '/assets/images/book-1.jpg', }, { 'name': 'education', 'image': '/assets/images/book-2.jpg', }, ] }];

  return (
    <Fragment>
      {categories.map((category) => (<Category category={category} />))}
    </Fragment>)
}

ReactDOM.render(
  <App />,
  document.getElementById("root")
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.1/umd/react-dom.production.min.js"></script>
<div id="root"></div>

Upvotes: 1

Related Questions