the JSON data which I get from service has different key-value pair. below is the example data which I need to convert the data in a table in the frontend and the first column and second column values are rowspan. is it possible to get rowspan dynamically based on records?
the data I have
const data = { header: [ { value: 'DPM', label: 'DPM' }, { value: 'Tracking Block', label: 'Tracking Block' }, { value: 'Assessment', label: 'Assessment' }, { value: 'POS', label: 'POS' }, { value: 'Online', label: 'Online' }, { value: 'Call Centre', label: 'Call Centre' }, ], datasets: [ {category: "Financing", subCategory: 'Capabilities', id: 'F.1', field: 'Channel availability', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Capabilities', id: 'F.2', field: '3rd party financing', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Capabilities', id: 'F.3', field: 'Finance Partner', pos: 'Text', online: 'Text', call: 'Text' }, {category: "Financing", subCategory: 'Awareness', id: 'F.8', field: '‘Monthly price’ Visibility', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Awareness', id: 'F.9', field: '0% IFC', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Awareness', id: 'F.10', field: '', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Customer Experience', id: 'F.11', field: 'Digital e2e journey', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Customer Experience', id: 'F.16', field: 'Process duration', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Staff Advocacy', id: 'F.17', field: 'Commission incentive?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Staff Advocacy', id: 'F.18', field: 'Part of Training?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Staff Advocacy', id: 'F.19', field: 'Individual targets?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Capabilities', id: 'STI.1', field: 'Channel availability', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Capabilities', id: 'STI.5', field: 'RV Period', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Capabilities', id: 'STI.6', field: 'Competitive RV (vs. ARS)', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Capabilities', id: 'STI.7', field: 'RV top-up?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Capabilities', id: 'STI.8', field: 'LoB availability', pos: 'Multi select dropdown', online: 'Multi select dropdown', call: 'Multi select dropdown' }, {category: "Spot Trade In", subCategory: 'Awareness', id: 'STI.9', field: 'Spot mechanism & Benefits', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Awareness', id: 'STI.12', field: 'CRM campaigns', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Customer Experience', id: 'STI.13', field: 'Buy-flow integration', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Customer Experience', id: 'STI.14', field: 'Omni-channel journey', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Customer Experience', id: 'STI.15', field: 'Device Grading (# questions)', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Staff Advocacy', id: 'STI.16', field: 'Commission incentive?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Staff Advocacy', id: 'STI.17', field: 'Part of Training?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, ] }
the code
const App = () => { return ( <div className="container-fluid p-2"> <div className="table-responsive border border-secondary"> <h4 className="text-center">Account+country</h4> <table className="table table-hover table-sm"> <thead className="table-bordered"> <tr> {data.header.map(element => { return ( <th scope="col" key={element.value} colSpan={element.colSpan}> <div className="d-flex flex-column"> <div className="p-2 bd-highlight">{element.label}<span className="text-danger">*</span></div> </div> </th> ) })} </tr> </thead> <tbody> {data.datasets.map(item => { return ( <tr key={item.id}> <td>{item.category}</td> <td>{item.subCategory}</td> <td>{item.field}</td> <td>{item.pos}</td> <td>{item.online}</td> <td>{item.call}</td> </tr> ) })} </tbody> </table> </div> </div> ) } export default App
my output image enter image description here
expected output enter image description here
Advertisement
Answer
You just have to manipulate the array first, something like this:
const datasets: = [ { account:{title: 'India', rowSpan: 23},category: {title: "Financing", rowSpan: 11}, subCategory: 'Capabilities', id: 'F.1', field: 'Channel availability', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Financing", rowSpan: 0}, subCategory: 'Capabilities', id: 'F.2', field: '3rd party financing', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Financing", rowSpan: 0}, subCategory: 'Capabilities', id: 'F.3', field: 'Finance Partner', pos: 'Text', online: 'Text', call: 'Text' }, { account:{title: 'India', rowSpan: 0},category: {title: "Financing", rowSpan: 0}, subCategory: 'Awareness', id: 'F.8', field: '‘Monthly price’ Visibility', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Financing", rowSpan: 0}, subCategory: 'Awareness', id: 'F.9', field: '0% IFC', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Financing", rowSpan: 0}, subCategory: 'Awareness', id: 'F.10', field: '', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Financing", rowSpan: 0}, subCategory: 'Customer Experience', id: 'F.11', field: 'Digital e2e journey', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Financing", rowSpan: 0}, subCategory: 'Customer Experience', id: 'F.16', field: 'Process duration', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Financing", rowSpan: 0}, subCategory: 'Staff Advocacy', id: 'F.17', field: 'Commission incentive?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Financing", rowSpan: 0}, subCategory: 'Staff Advocacy', id: 'F.18', field: 'Part of Training?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Financing", rowSpan: 0}, subCategory: 'Staff Advocacy', id: 'F.19', field: 'Individual targets?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Spot Trade In", rowSpan: 12}, subCategory: 'Capabilities', id: 'STI.1', field: 'Channel availability', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Spot Trade In", rowSpan: 0}, subCategory: 'Capabilities', id: 'STI.5', field: 'RV Period', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Spot Trade In", rowSpan: 0}, subCategory: 'Capabilities', id: 'STI.6', field: 'Competitive RV (vs. ARS)', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Spot Trade In", rowSpan: 0}, subCategory: 'Capabilities', id: 'STI.7', field: 'RV top-up?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Spot Trade In", rowSpan: 0}, subCategory: 'Capabilities', id: 'STI.8', field: 'LoB availability', pos: 'Multi select dropdown', online: 'Multi select dropdown', call: 'Multi select dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Spot Trade In", rowSpan: 0}, subCategory: 'Awareness', id: 'STI.9', field: 'Spot mechanism & Benefits', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Spot Trade In", rowSpan: 0}, subCategory: 'Awareness', id: 'STI.12', field: 'CRM campaigns', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Spot Trade In", rowSpan: 0}, subCategory: 'Customer Experience', id: 'STI.13', field: 'Buy-flow integration', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Spot Trade In", rowSpan: 0}, subCategory: 'Customer Experience', id: 'STI.14', field: 'Omni-channel journey', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Spot Trade In", rowSpan: 0}, subCategory: 'Customer Experience', id: 'STI.15', field: 'Device Grading (# questions)', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Spot Trade In", rowSpan: 0}, subCategory: 'Staff Advocacy', id: 'STI.16', field: 'Commission incentive?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, { account:{title: 'India', rowSpan: 0},category: {title: "Spot Trade In", rowSpan: 0}, subCategory: 'Staff Advocacy', id: 'STI.17', field: 'Part of Training?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, ];
To update the array:
const datasets = [ {category: "Financing", subCategory: 'Capabilities', id: 'F.1', field: 'Channel availability', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Capabilities', id: 'F.2', field: '3rd party financing', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Capabilities', id: 'F.3', field: 'Finance Partner', pos: 'Text', online: 'Text', call: 'Text' }, {category: "Financing", subCategory: 'Awareness', id: 'F.8', field: '‘Monthly price’ Visibility', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Awareness', id: 'F.9', field: '0% IFC', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Awareness', id: 'F.10', field: '', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Customer Experience', id: 'F.11', field: 'Digital e2e journey', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Customer Experience', id: 'F.16', field: 'Process duration', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Staff Advocacy', id: 'F.17', field: 'Commission incentive?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Staff Advocacy', id: 'F.18', field: 'Part of Training?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Financing", subCategory: 'Staff Advocacy', id: 'F.19', field: 'Individual targets?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Capabilities', id: 'STI.1', field: 'Channel availability', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Capabilities', id: 'STI.5', field: 'RV Period', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Capabilities', id: 'STI.6', field: 'Competitive RV (vs. ARS)', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Capabilities', id: 'STI.7', field: 'RV top-up?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Capabilities', id: 'STI.8', field: 'LoB availability', pos: 'Multi select dropdown', online: 'Multi select dropdown', call: 'Multi select dropdown' }, {category: "Spot Trade In", subCategory: 'Awareness', id: 'STI.9', field: 'Spot mechanism & Benefits', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Awareness', id: 'STI.12', field: 'CRM campaigns', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Customer Experience', id: 'STI.13', field: 'Buy-flow integration', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Customer Experience', id: 'STI.14', field: 'Omni-channel journey', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Customer Experience', id: 'STI.15', field: 'Device Grading (# questions)', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Staff Advocacy', id: 'STI.16', field: 'Commission incentive?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, {category: "Spot Trade In", subCategory: 'Staff Advocacy', id: 'STI.17', field: 'Part of Training?', pos: 'Dropdown', online: 'Dropdown', call: 'Dropdown' }, ]; const newDataSets = []; datasets.forEach((data) => { newDataSets.push({...data, category: {title: data.category, rowSpan: 0}, subCategory: {title: data.subCategory, rowSpan: 0}}) }) const countCategories = datasets.reduce( (acc, o) => (acc[o.category] = (acc[o.category] || 0)+1, acc), {} ); const distinctCategories = []; Object.keys(countCategories).forEach((data) => { distinctCategories.push({title: newDataSets[newDataSets.findIndex(x => x.category.title === data)].category.title, subCategories: newDataSets.filter(x => x.category.title === data)}); (newDataSets[newDataSets.findIndex(x => x.category.title === data)]).category.rowSpan = countCategories[data] }) distinctCategories.forEach((data) => { let countSubCategories = data.subCategories.reduce( (acc, o) => (acc[o.subCategory.title] = (acc[o.subCategory.title] || 0)+1, acc), {} ); Object.keys(countSubCategories).forEach((subKey) => { let subId = (data.subCategories.find(x => x.subCategory.title === subKey)).id; newDataSets[newDataSets.findIndex(x => x.id === subId)].subCategory.rowSpan = countSubCategories[subKey] }) }) console.log(newDataSets)
then on your jsx part,
<tbody> {newDataSets.map(item => { return ( <tr key={item.id}> {item.category.rowSpan ? ( <td rowspan={item.category.rowSpan}>{item.category.title}</td> ) : ''} {item.subCategory.rowSpan ? ( <td rowspan={item.subCategory.rowSpan}>{item.subCategory.title}</td> ) : ''} <td>{item.field}</td> <td>{item.pos}</td> <td>{item.online}</td> <td>{item.call}</td> </tr> ) })} </tbody>