In the web application I am building, I often loop through arrays of objects that are returned from an application programming interface (API) and display the data on the front-end using React. The following is an example JSON response from the API:
[
{
"id": 42,
"addressee": {
"id": 98,
"firstName": "James",
"lastName": "Deacon",
"photoLink": "images/IMG_3598.JPG",
"city": "Atlanta",
"state": "GA",
"country": "United States",
"createdAt": "2019-12-23T00:33:11.000Z",
},
},
{
"id": 43,
"addressee": {
"id": 99,
"firstName": "Billy",
"lastName": "Gato",
"photoLink": "/images/IMG_9923.JPG",
"city": "Chattanooga",
"state": "TN",
"country": "United States",
"createdAt": "2019-10-13T04:22:42.000Z",
}
}
]
I use React to map the above data retrieved from the API and pass it to a Card component as props, as shown below.
return(
<div className="list">
{list.map(element => (
<div className="card" key={element.id}>
<Card
addresseeId={element.addressee.id}
firstName={element.addressee.firstName}
lastName={element.addressee.lastName}
photoLink={element.addressee.photoLink}
city={element.addressee.city}
stateCode={element.addressee.stateCode}
createdAt={new Intl.DateTimeFormat("en-US", {
year: "numeric",
month: "long"
}).format(new Date(element.addressee.createdAt))}
/>
</div>
))}
</div>
)
Repeatedly copy and pasting "element.addressee" got to be tiresome, so I started thinking about how to use ES6's destructuring to make things less repetitive. The first thing I tried was the traditional const { x, y } = element pattern, but ESLint complained about "const". So I did some searching, but did not find much about how to destructure the current element in Array.prototype.map() in JSX.
I almost gave up, but finally resorted to reading the documentation and stumbled on assignment without declaration, where a variable can be assigned its value separately from its declaration. With this syntax ({ x, y } = element) is valid, just like const { x, y } = element. In the case of Array.prototype.map(), array.map(({ x, y }) => { //callback function }); will destructure element and assign x and y. The below code snippet shows how I used this to refactor the card component and skip typing "element.addressee" several times.
return(
<div className="list">
{matchesFilteredByStatus.map(
({ id, addressee: {
id: addresseeId,
firstName,
lastName,
photoLink,
city,
stateCode,
createdAt}, }) => (
<div className="card" key={id}>
<Card
addresseeId={addresseeId}
firstName={firstName}
lastName={lastName.substring(0,1) + "."}
photoLink={photoLink}
city={city}
stateCode={stateCode}
createdAt={new Intl.DateTimeFormat("en-US", {
year: "numeric",
month: "long"
}).format(new Date(createdAt))}
/>
</div>
))}
</div>
)
Top comments (1)
Great Article managed to explain something I had difficulty putting into words.