Iterating through JSON data using the map function - arrays

Here is the app working with the one dimensional data set:
https://boiling-coast-12353.herokuapp.com/
I wrote code that made clickable buttons for each country in my data. But now I need to use a data set structured differently so I can transform the data.
My data set is now like this:
{
"2010": [
{ "Country": "Argentina", "Percentage": 10.44 },
{ "Country": "Bolivia", "Percentage": 51.62 },
...
],
"2011": [
{ "Country": "Argentina", "Percentage": 10.34 },
{ "Country": "Bolivia", "Percentage": 51.62 },
...
],
....
}
Im trying to generate a button for each country, but the code I used before no longer works:
{
this.state.data.map((data, index) => (
<button key={index}className="button-primary" onClick={() => {this.onChooseCountry(index);
}}><span className="btn-content" tabindex="-1">
</span>{data.Country}</button>
))
}

What you have actually done is changes your data from an array to JSON Object. Here is the following code on how to iterate through a nested JSON array of your structure:
class App extends React.Component{
render(){
var json = {
"2010":[{ "Country": "Argentina", "Percentage": 10.44 },
{ "Country": "Bolivia", "Percentage": 51.62 }],
"2011":[{ "Country": "Argentina", "Percentage": 10.44 },
{ "Country": "Bolivia", "Percentage": 51.62 }]
};
return <div> {Object.keys(json).map(year => json[year].map(data => <button> {year} | {data["Country"]}</button>))} </div>
}
}
ReactDOM.render(
<App/>,
document.body
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.1.1/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.1.1/umd/react-dom.production.min.js"></script>

Related

How to parse a nested json file in typescript (.tsx)?

I'm new to typescript and looking for a way to parse this nested json data given below and display the following info after parsing:
Date: 2022-10-27T16:28:01Z
Typename": Asset,
PolicyId: 12345678abcdef,
Asset Name: 12345678abc,
Quantity:5000,
Output txHash: 1212345678abcdef,
Output txHash: 1212345678abcdef1234
{
"transactions": [
{
"__typename": "Transaction",
"includedAt": "2022-10-27T16:28:01Z",
"mint": [
{
"__typename": "Token",
"asset": {
"__typename": "Asset",
"policyId": "12345678abcdef",
"assetName": "12345678abc",
"name": null
},
"quantity": "5000"
}
],
"outputs": [
{
"__typename": "TransactionOutput",
"txHash": "1212345678abcdef",
"value": "1500000",
"tokens": [
{
"__typename": "Token",
"asset": {
"__typename": "Asset",
"policyId": "12345678abcdef",
"assetName": "12345678abc"
},
"quantity": "5000"
}
]
},
{
"__typename": "TransactionOutput",
"txHash": "12bcd12345678abcdef1234",
"value": "9998312015",
"tokens": []
}
]
}
]
}
`
I tried the following code:
const myJSON = JSON.stringify(data, null, 2);
const myArray = JSON.parse(myJSON);
and was able to display the Date:
const DisplayData1 = myArray.transactions.map(
(info:any) => {
return(
<tr>
<td>{info.includedAt}</td>
</tr>
)
}
)
I'm not able to proceed due to the nested nature of the json file and my lack of familiarity with tsx. All help appreciated. Thanks.
Need to add the nested loop to show data.
Also in order to access keys starting with -, use a square bracket instead of the . operator. like obj['__typename']
const DisplayData1 = myArray.transactions.map(
(info:any) => {
return(
<tr>
<td>{info.includedAt}</td>
{
info.mint.map((i) => {
return (
<td>{i['__typename']}</td>
<td>{i.quantity}</td>
<td>{i.asset.policyId}</td> // access `asset` object
)
})
}
</tr>
)
}
)

Having problems parsing json complex data in react js. Map error

App.js
I am facing this issue file error - Uncaught TypeError: items.data.map is not a function. I have tried some other options but did not work. I cant seem to find what I am doing wrong.
.then((res) => res.json())
.then((json) => {
this.setState({
items: json,
DataisLoaded: true
});
})
}
render() {
const { DataisLoaded, items } = this.state;
if (!DataisLoaded) return <div>
<h1> Loading data ... </h1> </div> ;
return (
<div className = "App">
<h1> Fetch data from an api in react </h1> {
items.data.map((item) => (
<ol key = { item.data} >
Continents: {item.data[0]}
</ol>
))
}
</div>
);
}
}
export default App;
JSON Data
Nested API data from json data type.
{
"data": {
"data": [
{
"project_id": "xxxx",
"title": "xxx34",
"description": "xxx23",
"expense": 1699126,
"budget": 6418516,
"country": "xxx",
"sector": [
{
"name": "Accelerate structural transformations",
"code": "18"
}
],
"sdg": [
{
"name": "Peace, justice, and strong institutions",
"id": "16"
}
],
"signature_solution": [
{
"name": "Strengthen effective, inclusive and accountable governance",
"id": "2"
}
],
"donor": [
"Australian DFAT",
"GLOBAL FUND TO FIGHT AIDS, TUBERCULOSIS",
"UNITED NATIONS DEVELOPMENT PRO"
],
"marker": [
"Hows",
"Joint Programme",
"Partner",
"Whos",
"COVID-19 Response"
]
},
{
],
"links": {
"next": null,
"previous": null
},
"count": 44
},
"status": 200,
"success": true
}
I tried data.data.map but still facing the same error. What am I doing wrong here?
Firstly, the TypeError you got is syntax error. The implementation of an arrow function must follow by curly brackets
items.data.map((item) => (
<ol key = { item.data} >
Continents: {item.data[0]}
</ol>
))
to
items.data.map((item) => {
<ol key = { item.data} >
Continents: {item.data[0]}
</ol>
})
Secondly, items you are mapping is a nest of JSON object - key: value pair. It's not suitable for mapping.
The mapping iterator or iterating an array is perfect when used to retrieve
data from a sequence item have the same or similar structure.
E.g:
const arr = [{"id": "1", "name": "a"}, {"id": "2", "name": "b"}, {"id": "3", "name": "c"}];
arr.map((item) => {
console.log(item.id);
console.log(item.name);
})
You should pretreat your data first.

How to map a nested JSON response in React

I have to map the nested JSON result in React. The below one is the response I got as response from backend API.
{
"id": 2,
"name": "sanjna",
"email": "vv#gmail.com",
"address": "iiiii, hhh",
"gender": "1",
"tagline": "Friendly to all",
"description": "4 years experience in programming",
"languages": "English ",
"key_skills": [
{
"id": 1,
"name": "RUBY ON RAILS, HTML, BOOTSTRAP, JQUERY, REACT",
"relevant_experience": "4"
},
{
"id": 2,
"name": "ruby",
"relevant_experience": "2"
}
],
"certifications": [
{
"id": 1,
"name": "MCA",
"institution_name": "vvv unversity",
"certification_date": "20-12-2020",
"image": null
},
{
"id": 2,
"name": "HTML training",
"institution_name": "nnn unversity",
"certification_date": "20-12-2022",
"image": null
}
],
"educations": [
{
"id": 1,
"qualification": "MCA",
"course": "Masters Degree PG",
"institute": "kkk",
"ins_location": "jjjj",
"passing_year": "2015"
}
]
}
This is my React code to get this response
const [singleUserDetail, setsingleUserDetail] = React.useState('');
let logged_user_id = job_seeker.actable_id;
const getsingleUserDetails = (logged_user_id) => {
axios
.get(`http://localhost:3001/users/${logged_user_id}`, { withCredentials: true })
.then((response) => {
const singleUserDetail = response.data;
setsingleUserDetail(response.data)
console.log(response.data); //prints the above JSON results in console
})
.catch((error) => {
console.log(" error", error);
});
};
React.useEffect(() => {
getsingleUserDetails(logged_user_id);
}, [logged_user_id]);
When I prints {singleUserDetail.name} it gives me result sanjna
{singleUserDetail.email} it gives me result vvv#gmail.com
{singleUserDetail. address} it gives me result iiiii, hhh. from my above JSON result
But how to print keyskills, certifications and educations here with mapping. I'm a beginner in React.
Youu can do something like this, my example is very simple,but you can complicate this as much as you need, with conditions or loops in loops.
<div>
{singleUserDetail.name},{singleUserDetail.email},{singleUserDetail.address},{singleUserDetail.gender},{singleUserDetail.tagline},{singleUserDetail.description}, {singleUserDetail.languages}
</div>
{singleUserDetail.key_skills.map((skill)=>{
return(
<div key={skill.id}>
{skill.name}:{skill.relevant_experience}
</div>
);
})}
{singleUserDetail.certifications.map((certification)=>{
return(
<div key={certification.id}>
{certification.name},{certification.institution_name},{certification.certification_date}
</div>
);
})}
{singleUserDetail.educations.map((education)=>{
return(
<div key={education.id}>
{education.qualification},{education.course},{education.institute}
</div>
);
})}
For more information, React documentation

Handling normalized data for displaying in the page - redux

Consider that i have the normalized object like this in redux store
{
"entities": {
"listings_by_id": {
"1": {
"id": 1,
"address": "991 Folsom St, San Francisco, CA 94107, USA",
"info": "Triplex 4,000 sqft",
"cap": "7.1",
"position": {
"lat": 37.778519,
"lng": -122.40564
}
},
"2": {
"id": 2,
"address": "1139004, San Francisco, CA 94118, USA",
"info": "Duplex 1,500 sqft",
"cap": "6.8",
"position": {
"lat": 37.768519,
"lng": -122.43564
}
}
}
},
"result": [
1,
2
]
}
In want to display the property list in the UI. Something like
Triplex 4,000 sqf
CAP RATE: 7.1
Duplex 1,500 sqft
CAP RATE: 6.2
Do i need to denormalize again for displaying in UI? If yes, where do i handle this - mapStateToProps?
Any help would be much appreciated.
You can add result into mapStateToProps and then iterate it like this
return this.props.result.map(a=>{
return <><div>{state.entities.listings_by_id[a].info}</div><div>{state.entities.listings_by_id[a].cap}</div></>
})
Here result should be mapped like this
const mapStateToProps = (state) => ({
result:state.reducername.result
});
and state.entities is the store
import store from 'path/ReactReducers/store';
state.entities should be replaced as store.getState().reducername.
As Justcode said above, the best way is handle that on mapStateToProps function. I created a codepen to show you how to do it. https://codepen.io/aquilesb/pen/bOKrzP
//Import any modules from libraries
const { Provider, connect } = ReactRedux;
const { createStore } = Redux;
// initial state
const initialState = { test:{
"entities": {
"listings_by_id": {
"1": {
"id": 1,
"address": "991 Folsom St, San Francisco, CA 94107, USA",
"info": "Triplex 4,000 sqft",
"cap": "7.1",
"position": {
"lat": 37.778519,
"lng": -122.40564
}
},
"2": {
"id": 2,
"address": "1139004, San Francisco, CA 94118, USA",
"info": "Duplex 1,500 sqft",
"cap": "6.8",
"position": {
"lat": 37.768519,
"lng": -122.43564
}
}
}
},
"result": [
1,
2
]
}};
// create store
let store = createStore(state => state, initialState);
const ReduxTextField = ({ entities }) =>(
<ul>
{ Object.entries(entities).map((entity) =>(
<li>
<div><span style={{marginRight:'10px'}}>Info:</span>{entity[1].info}</div>
<div><span style={{marginRight:'10px'}}>CAP:</span>{entity[1].cap}</div>
</li>
))}
</ul>)
const mapStateToProps = function (state) {
return {
entities: state.test.entities.listings_by_id
}
}
//shorter way to write mapStateToProps
//const mapStateToProps = state => ({ entities: state.test.entities.listings_by_id })
const ReduxTextFieldContainer = connect(mapStateToProps, null)(ReduxTextField);
//Create teh app component which contains the button and text field
class App extends React.Component {
render() {
return (
<div>
<ReduxTextFieldContainer />
</div>
)
}
}
//Finally render to DOM!
ReactDOM.render(<Provider store={store}><App/></Provider>, document.getElementById('root'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-redux/6.0.0/react-redux.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/redux/4.0.1/redux.min.js"></script>
<div id="root"></div>

How can you display an specific number of rendering after mapping a json object?

This is my json object.
"properties":{
"summary":[
{
"id":0,
"name": "John Doe",
"address": "Privet Drive",
"sex":"M"
},
{
"id":1,
"name": "John Smith",
"address": "Elm Street",
"sex":"M"
},
{
"id":2,
"name": "Jane Doe",
"address": "Privet Drive B",
"sex":"F"
},
{
"id":3,
"name": "Peter Parker",
"address": "Privet Drive C",
"sex":"M"
},
{
"id":4,
"name": "Harry Potter",
"address": "Privet Drive D",
"sex":"M"
}
]
}
This is the on my react file
class Thumbnail extends React.Component{
render(){
const datax = this.props.info;
return (
<div>
{
datax.map(function(obj){
{
let summary = obj.properties.summary;
let summaryLength = summary.length;
return (
summary.map(function(item){
return <div className={"col-md-3 col-sm-6"} key={item.id}>
<p>
<a href={'http://localhost:8080/'} className="listing-link">
<PersonName name={item.name} />
</a>
</p>
<PersonAddress address={item.address} />
<PersonSex address={item.sex} />
</div>;
})
)
}
})
}
</div>
)
}
}
The ReactDom.render is on a different file which I can access by this:
ReactDOM.render(<Thumbnail info={data} />, document.getElementById('featured-list'));
I want to display only 4 sets of properties from the props object. This code displays 5 of them based on the props which has 5 sets.
I tried doing a iteration inside the map function but it fails.
How can I achieve this?
You can use slice to display only first four sets. You can try like this :
summary.slice(0,4).map(function(item){ .... })
That will return only first four sets. Here is a fiddle
Another solution
With the iteration inside the map function, you can do it like this :
{summary.map((s, i) => i <= 3 ? <div key={i}>{s.name}</div> : "")}
That will also return only first four sets. Here is a fiddle.
Hope this helps.

Resources