Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Mapping through array of objects doesn't work in Table component

In a React project, I have a table component which gets array of array structured JSON data and works fine, but, how could it done for array of objects structured JSON data. Following is the code for reference

Below is the array of array JSON data

const store_grid_data = {
    data: [
      [
        { id: 1 },
        false,
        "McDonalds",
        "Burger Store",
        "Mike John",
        "YYYY/MM",
        "Best Food Chain"
      ],
      [
        { id: 2 },
        false,
        "KFC",
        "Chicken Food Store",
        "Rock Wills",
        "YYYY/MM",
        "Best Food Chain Globally"
      ]
    ],
    page_info: {
      total_pages: 5,
      current_page: 1
    }
  };

Here I initialize and also set it

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

  let GridConfig = {};
  let grid_data = {};

  GridConfig = TableConfig;
  grid_data = store_grid_data;

  const [gridConfigData, setGridConfigData] = useState(GridConfig);
  const [gridData, setGridData] = useState(grid_data);

return (
    <>
      <Grid GridConfig={gridConfigData} GridData={gridData} />
    </>
  );

Below is the Columns section of Table

const TableConfig = {
  column_config: [
    {
      title: "",
      col_span: 1,
      sorted_order: "None",
      data_type: "check_box",
      cell_click_callback: true
    },
    {
      title: "Company",
      col_span: 1,
      sorted_order: "None",
      data_type: "text",
      cell_click_callback: false
    },
    {
      title: "Desc",
      col_span: 1,
      sorted_order: "None",
      data_type: "text",
      cell_click_callback: false
    }
  ]
};

export default TableConfig;

And now the entire Table structure

let colConfig = props.GridConfig.column_config;
  let gridData = props.GridData.data;

  return (
    <div className="table-responsive pt-3">
      <table className="table table-bordered table-striped" width="100%">
        <thead>
          <tr>
            {colConfig.map((d, key) => {
              return (
                <th key={key} colSpan={d.col_span} className={d.title_class}>
                  {d.title}
                </th>
              );
            })}
          </tr>
        </thead>
        <tbody>
          {gridData.map((rowData, rIndex) => {
            return (
              <tr
                key={`tr_${rowData[0].id}`}
                className={rowData[0].row_properties}
              >
                {rowData.slice(1).map((colData, cIndex) => {
                  return (
                    <td
                      key={`td_${rIndex}_${cIndex}`}
                      className={colConfig[cIndex].data_col_class}
                    >
                      {colConfig[cIndex].data_type === "text" &&
                        colConfig[cIndex].cell_click_callback && (
                          <div>
                            <a
                              onClick={() =>
                                clickCallback(
                                  colConfig[cIndex].title,
                                  cIndex + 1,
                                  rowData[0].id
                                )
                              }
                            >
                              {" "}
                              {colData}{" "}
                            </a>
                          </div>
                        )}
                      {colConfig[cIndex].data_type === "text" &&
                        !colConfig[cIndex].cell_click_callback && (
                          <div>{colData}</div>
                        )}
                    </td>
                  );
                })}
              </tr>
            );
          })}
        </tbody>
      </table>
    </div>
  );
};

I want to set data with array of objects as

const newStoreData = {
    data: [
      {
        id: 252,
        compName: "Burger King",
        desc: "Burger Store",
        franchise: "Harry Tyson",
        estDate: "2020/11",
        feedBack: "Best Burgers"
      },
      {
        id: 321,
        compName: "Starbucks",
        desc: "Coffee Store",
        franchise: "George Speilsberg",
        estDate: "2018/04",
        feedBack: "Best Coffee"
      }
    ],
    page_info: {
      total_pages: 10,
      current_page: 1
    }
  };

What could be the best solution to tackle this. Any suggestion highly appreciated

Please refer Codesandbox link: https://codesandbox.io/s/bold-boyd-2e16j6

>Solution :

I think that simply changing the way you point to the properties and changing the second map of the table so you can use it in a JSON would do the trick.

Something like this:

        <tbody>
          {gridData.map((rowData, rIndex) => {
            return (
              <tr key={`tr_${rowData.id}`}>
                {Object.keys(rowData).map((key, cIndex) => {
                  return (
                    <td
                      key={`td_${rIndex}_${cIndex}`}
                      className={colConfig[cIndex].data_col_class}
                    >
                      {colConfig[cIndex].data_type === "text" &&
                        colConfig[cIndex].cell_click_callback && (
                          <div> {rowData[key]} </div>
                        )}
                      {colConfig[cIndex].data_type === "text" &&
                        !colConfig[cIndex].cell_click_callback && (
                          <div>{rowData[key]}</div>
                        )}
                    </td>
                  );
                })}
              </tr>
            );
          })}
        </tbody>

Note that in this example I used "old" syntax. You can find more recent syntax in the following post.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading