I have a JSON object and I want to display it on my page but am having a problem with how to loop through the JSON object using the map function in React.
How can I display the data accessing the content of the object? Any help will be appreciated thanks in advance
My data
const product = {
"items": {
"page": "1",
"real_total_results": 500,
"total_results": 500,
"page_size": 10,
"pagecount": 50,
"item": [
{
"title": "2022 Martin Men's Shoes Pigskin Autumn",
"pic_url": "https://cbu01.alicdn.com/img/ibank/O1CN01iURzli2Ka1udcUHnM_!!2212881679572-0-cib.jpg",
"promotion_price": "83.00",
"price": "83.00",
"sales": 223,
"turnover": "1万 ",
},
{
"title": "Single shoe summer",
"pic_url": "https://cbu01.alicdn.com/img/ibank/O1CN01eMAlUd1GfHlfmUnE1_!!2211426400649-0-cib.jpg",
"promotion_price": "5.30",
"price": "5.30",
"sales": 381884,
"turnover": "27万 ",
},
{
"title": "Men's shoes and women's shoes Beijing",
"pic_url": "https://cbu01.alicdn.com/img/ibank/O1CN01pshk1P27HAb7t9H5i_!!2208535077771-0-cib.jpg",
"promotion_price": "5.00",
"price": "5.00",
"sales": 94815,
"turnover": "7万 ",
},
{
"title": "2022 Running Shoes Sneakers",
"pic_url": "https://cbu01.alicdn.com/img/ibank/O1CN01KNh1N31Dwk4VGdCWB_!!2863830281-0-cib.jpg",
"promotion_price": "82.00",
"price": "82.00",
"sales": 16573,
"turnover": "4万 ",
},
],
},
}
My code
<div className="row items">
{product.items.map((values) => {
return(
<div className="col-lg-3 col-md-4 col-sm-6 col-6" >
<span>Total: {values.total_results}</span>
values.item.map((val) =>{
return(
<div className="productImage">
<img style={{height:'100%', width: '100%'}}src={val.pic_url} alt="" />
</div>
<Link to='/' style={{textDecoration:'none', color:"#1a1a1a"}}>
<div className="cardDetail">
<div >
<p>{val.title}</p>
</div>
<div>
<h6>¥ {val.price}</h6>
</div>
<div>
<h6>¥ {val.sales}</h6>
</div>
</div>
</Link>
)
})
</div>
)
})}
</div>
I want to get the page, total_results, page_size and also get item array content like the title, pic_url, prices and so on
CodePudding user response:
You cannot map on Object, So you have to wrap the product.items into Array as you can see the below code also here you can see the live example of your code.
import React from "react";
export default function App() {
const product = {
items: {
page: "1",
real_total_results: 500,
total_results: 500,
page_size: 10,
pagecount: 50,
item: [
{
title: "2022 Martin Men's Shoes Pigskin Autumn",
pic_url:
"https://cbu01.alicdn.com/img/ibank/O1CN01iURzli2Ka1udcUHnM_!!2212881679572-0-cib.jpg",
promotion_price: "83.00",
price: "83.00",
sales: 223,
turnover: "1万 "
},
{
title: "Single shoe summer",
pic_url:
"https://cbu01.alicdn.com/img/ibank/O1CN01eMAlUd1GfHlfmUnE1_!!2211426400649-0-cib.jpg",
promotion_price: "5.30",
price: "5.30",
sales: 381884,
turnover: "27万 "
},
{
title: "Men's shoes and women's shoes Beijing",
pic_url:
"https://cbu01.alicdn.com/img/ibank/O1CN01pshk1P27HAb7t9H5i_!!2208535077771-0-cib.jpg",
promotion_price: "5.00",
price: "5.00",
sales: 94815,
turnover: "7万 "
},
{
title: "2022 Running Shoes Sneakers",
pic_url:
"https://cbu01.alicdn.com/img/ibank/O1CN01KNh1N31Dwk4VGdCWB_!!2863830281-0-cib.jpg",
promotion_price: "82.00",
price: "82.00",
sales: 16573,
turnover: "4万 "
}
]
}
};
return (
<div className="App">
{Array(product.items).map((values) => {
return (
<div className="col-lg-3 col-md-4 col-sm-6 col-6">
<span>Total: {values.total_results}</span>
{values.item.map((val) => (
<>
<div className="productImage">
<img
style={{ height: "100%", width: "100%" }}
src={val.pic_url}
alt=""
/>
</div>
<Link
to="/"
style={{ textDecoration: "none", color: "#1a1a1a" }}
>
<div className="cardDetail">
<div>
<p>{val.title}</p>
</div>
<div>
<h6>¥ {val.price}</h6>
</div>
<div>
<h6>¥ {val.sales}</h6>
</div>
</div>
</Link>
</>
))}
</div>
);
})}
</div>
);
}
CodePudding user response:
Your product.items is not an array, so you cannot use map on it.
You're also missing brackets in the 2nd map, and you need to add a wrapper element on JSX of the 2nd map as well, I use React.Fragment in this case.
It should be like below
<div className="row items">
<div className="col-lg-3 col-md-4 col-sm-6 col-6">
<span>Total: {product.items.total_results}</span>
{product.items.item.map((val) => (
<React.Fragment>
<div className="productImage">
<img
style={{ height: "100%", width: "100%" }}
src={val.pic_url}
alt=""
/>
</div>
<Link to="/" style={{ textDecoration: "none", color: "#1a1a1a" }}>
<div className="cardDetail">
<div>
<p>{val.title}</p>
</div>
<div>
<h6>¥ {val.price}</h6>
</div>
<div>
<h6>¥ {val.sales}</h6>
</div>
</div>
</Link>
</React.Fragment>
))}
</div>
</div>
CodePudding user response:
The map function is a method of the Array.prototype which means it won't work on an object
