Search code examples
javascriptreactjsrestfetch

How to display nested array of objects from REST call in different sections of the page?


I have a REST call which returns different sets of result. Each data set contains data for different parts of the page. It contains nested array of objects and I am not sure how do I easily display the name and value pairs from the rest call to my page depending on the certain section.

Here's what the REST call response looks like:

{
    "dstrSpecificHelpRs": [
        {
            "row": [
                {
                    "name": "HELP_TEXT_TITLE_NM",
                    "value": "TestAgain and again and again and again andagain50",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "HELP_TEXT_ID",
                    "value": "100114",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "Help",
                    "value": "Help",
                    "link": {
                        "exists": true,
                        "linkType": "url",
                        "linkId": "www.google.com"
                    }
                }
            ]
        },
        {
            "row": [
                {
                    "name": "HELP_TEXT_TITLE_NM",
                    "value": "Testing  Helpline Page and 2301 DisasterONLY",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "HELP_TEXT_ID",
                    "value": "100174",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "Help",
                    "value": "Help",
                    "link": {
                        "exists": true,
                        "linkType": "url",
                        "linkId": "www.google.com"
                    }
                }
            ]
        }
    ],
    "rgstInfoRs": [
        {
            "row": [
                {
                    "name": "PREFIX_NM",
                    "value": "MS",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "FST_NM",
                    "value": "MITZI",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                }
            ]
        }
    ],
    "insSettlementRs": [
        {
            "row": [
                {
                    "name": "ON_FILE",
                    "value": "0",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                }
            ]
        }
    ],
    "dstrOptionRs": [
        {
            "row": [
                {
                    "name": "DSTR_OPTION",
                    "value": "1",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "HELPLINE_AREA_CD",
                    "value": "818",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "HELPLINE_PHN_NR",
                    "value": "5055511",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                }
            ]
        }
    ],
    "correspondenceOutRs": [
        {
            "row": [
                {
                    "name": "SUMMARY_CD_TX",
                    "value": "SUPER,SEAL,APPR_INTRO,APPROVAL,ECNA",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                }
            ]
        },
        {
            "row": [
                {
                    "name": "SUMMARY_CD_TX",
                    "value": "9069CL,SEAL",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "ASTN_PGM_CD",
                    "value": "MISC",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "GENERATED_DT",
                    "value": "2020-09-03 14:08:10.0",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                }
            ]
        }
    ],
    "statePhoneRs": [],
    "insAssistanceRs": [
        {
            "row": [
                {
                    "name": "DOC_ID",
                    "value": "",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                },
                {
                    "name": "RGSN_ID",
                    "value": "370002900",
                    "link": {
                        "exists": false,
                        "linkType": null,
                        "linkId": null
                    }
                }
            ]
        }
    ]
}

and here's what I have working so far:

class App extends React.Component {
  constructor(props) {
    super(props);
    this.setState = {
      data: []
    };
  }

  componentDidMount() {
    fetch("https://demo3531217.mockable.io/getRegistrationData")
      .then((res) => res.json())
      .then((res) => {
        const responseData = this.getPayloadObject(res);
        this.setState({
          data: responseData
        });
      })
      .catch((error) => console.error(error));
  }

  getPayloadObject = (action) => {
    console.log(action);
    Object.keys(action).forEach((key) => {
      if (typeof action[key] === "object") {
        const payload = action[key];
        let result = _.map(
          payload,
          (data, i) => {
            const row = data["row"];
            const rowData = _.map(row, (item) => {
              return {
                name: item.name,
                value: item.value
              };
            });
            console.log("rowData ", rowData);
          },
          []
        );
        return result;
      }
    });
  };

  render() {
    return (
      <div>
        <div>
          <h1>Section 1</h1>
        </div>
        <div>
          <h1>Section 2</h1>
        </div>
      </div>
    );
  }
}

if I wanted to display certain data for specific section how do I so in my page? Can someone please help?

link for sandbox can be found here: https://codesandbox.io/s/vibrant-sid-i140l?file=/src/App.js:75-1304


Solution

  • Let's try breaking the state into multiple sections. Something like this.

    constructor(props) {
        super(props);
        this.state = {
          dstrSpecificHelpRs: [],
          rgstInfoRs: [],
          insSettlementRs: [],
          dstrOptionRs: [],
          correspondenceOutRs: [],
          statePhoneRs: [],
          insAssistanceRs: []
        };
      }
    

    Then, let's deconstruct the API response and set individual items in the state.

    componentDidMount() {
        fetch("https://demo3531217.mockable.io/getRegistrationData")
          .then((res) => res.json())
          .then((res) => {
            // const responseData = this.getPayloadObject(res);
            const {
              dstrSpecificHelpRs,
              rgstInfoRs,
              insSettlementRs,
              dstrOptionRs,
              correspondenceOutRs,
              statePhoneRs,
              insAssistanceRs
            } = res;
            this.setState({
              dstrSpecificHelpRs: dstrSpecificHelpRs,
              rgstInfoRs: rgstInfoRs,
              insSettlementRs: insSettlementRs,
              dstrOptionRs: dstrOptionRs,
              correspondenceOutRs: correspondenceOutRs,
              statePhoneRs: statePhoneRs,
              insAssistanceR: insAssistanceRs
            });
          })
          .catch((error) => console.error(error));
      }
    

    Now all you have to do is find a way to loop through individual items in the state. Something like this

    render() {
        const dstrSpecificHelpRs = this.state.dstrSpecificHelpRs.map(row => row["row"]);
        console.log("Sample = ", sample);
        return (
          <div>
            <div>
              <h1>Section 1</h1>
              <div>
                {dstrSpecificHelpRs.map(item => item.map(key => <p>{key.name}</p>))}
              </div>
            </div>
            <div>
              <h1>Section 2</h1>
            </div>
          </div>
        );
      }
    

    This is by no means a perfect solution though. If you could change the response model, that would have been sweet!.