Ошибка рендеринга реакции с вложенными записями данных json

#reactjs #jsx

#reactjs #jsx

Вопрос:

Мне нужна помощь при рендеринге данных из файла JSON. Ну, в файле JSON есть несколько записей, и для этого я использую функцию map . Я успешно получаю данные из атрибутов заголовка, но внутри каждой записи снова есть массив / вложенные элементы, и когда я пытаюсь это отобразить, я получаю сообщение об ошибке TypeError: Cannot read property 'map' of undefined . Я попытался просто отобразить вложенные массивы в каждой записи отдельно, но все еще не работает. Вот мой код ниже.

    import React, { Component } from "react";
import "../src/css/custom.css";
import data from "../src/data/Items.json";

class PenItems extends Component {

  render() {

    if (!data) {
      return <h1>Loading....</h1>
    }

    return (

      <div className="container">
        <table className="table table-responsive">
          <thead>
            <tr>
              <th scope="col">ID</th>
              <th scope="col">Status</th>
              <th scope="col">Requester</th>
              <th scope="col">Reason / State</th>
            </tr>
          </thead>
          <tbody>
            {data.map((record, index) => (
              <tr key={record.index}>
                
                <td>{record.UniqueName}</td>
                <td>{record.StatusString}</td>
                <td>{record.Requester.UniqueName}</td>

                 // the below code is generating an error which is another array inside each record.
                {data.ApprovalRequests.map((record, index) => (
                  <td key={record.index}>{record.Reason} - {record.State}</td>
                ))}

              </tr>
            ))}
          </tbody>
        </table>
      </div>
    );
  }
}

export default PenItems;
  

Вот пример JSON.

    {
    "Records": [
     //Record 1
        
{
    "StatusString": "Submitted",
    "UniqueName": "IT2566",
    "ApprovalRequests": [  // second loop
        {
            "State": 1,
            "Reason": "Needed For office",
            "Approver": [ // third loop
                {
                    "UniqueName": "xyz"
                },
                {
                    "UniqueName": "xyz"
                },
                {
                    "UniqueName": "xyz"
                }
            ]
        },
        {
            "State": 1,
            "Reason": "Official Requirement",
            "Approver": {
                "UniqueName": "Jhon"
            }
        }
    ]
},
           // Record 2
            {
                "Requester": {
                    "UniqueName": "985521"
                },
                "StatusString": "Submitted",
                "UniqueName": "IT2566",
                "ApprovalRequests": [
                    {
                        "State": 1,
                        "Reason": "Needed For office",
                        "Approver": {
                            "UniqueName": "Daisy Wang"
                        }
                    },
                    {
                        "State": 1,
                        "Reason": "Official Requirement",
                        "Approver": {
                            "UniqueName": "Jhon"
                        }
                    }
                ]
            }
        ]
    }
  

Спасибо всем.

Ответ №1:

Вы должны выполнить цикл record , чтобы получить ApprovalRequests

   <tbody>
    {data.map((record, index) => (
      <tr key={record.index}>

        <td>{record.UniqueName}</td>
        <td>{record.StatusString}</td>
        <td>{record.Requester.UniqueName}</td>

       // the below code is generating an error which is another array inside each record.
       {record.ApprovalRequests.map((approvalRequest, index) => (
         <td key={approvalRequest.index}>{approvalRequest.Reason} - {approvalRequest.State}</td>
       ))}

       </tr>
     ))}
  </tbody>
  

Комментарии:

1. У меня нет слов, чтобы поблагодарить вас, но все равно большое спасибо :-). Сейчас он отлично работает.

2. Привет @Akanksha. У меня есть еще один вопрос, пожалуйста. Что, если во втором вложенном цикле есть еще один третий массив?

3. Затем у вас есть цикл approvalRequest , чтобы получить данные второго вложенного цикла.

4. Спасибо. Я обновил JSON. Не могли бы вы, пожалуйста, взглянуть на первую запись JSON?

5. Вы должны сделать approvalRequest.approver.map((approver, index) => ())