const data = [{"id":"Client 1","aName""advisorName":"Dhanush","mName""managerName":"Nikolai","cName""clientName":"Thor Odin","gName""goalName":"","gAmount""goalAmount":"","gls""goals":2,"value""score":0.855,"date""lastModified":"22/1/2022","income""equityFixedIncome":"","rows""subRows":[{"id":"goal-1","cName""clientName":"","mName""managerName":"","aName""advisorName":"","gName""goalName":"Retirement1","gAmount""goalAmount":10000,"gls""goals":1,"income""equityFixedIncome":"60/40","date""lastModified":"22/1/2022","value""score":0.99},{"id":"goal-2","cName""clientName":"","mName""managerName":"","aName""advisorName":"","gName""goalName":"Save For Child Education","gAmount""goalAmount":70000,"gls""goals":1,"income""equityFixedIncome":"55/45","date""lastModified":"5/12/2023","value""score":0.72}]},{"id":"Client 2","aName""advisorName":"Dhanush","mName""managerName":"Nikolai","cName""clientName":"Steve Rogers","gName""goalName":"Save for Investment","gAmount""goalAmount":67000,"gls""goals":1,"value""score":0.7,"date""lastModified":"22/1/2022","income""equityFixedIncome":"60/40"},{"id":"Client 3","aName""advisorName":"Dhanush","mName""managerName":"Nikolai","cName""clientName":"Wanda Vision","gls""goals":0,"value""score":0.9,"date""lastModified":"","income""equityFixedIncome":""},{"id":"Client 4","aName""advisorName":"Dhanush","mName""managerName":"Nikolai","cName""clientName":"Tony Stark","gName""goalName":"","gAmount""goalAmount":"","gls""goals":2,"value""score":0.29,"date""lastModified":"27/10/2019","income""equityFixedIncome":"","rows""subRows":[{"id":"goal-4","cName""clientName":"","mName""managerName":"","aName""advisorName":"","gName""goalName":"Education Loan","gAmount""goalAmount":500,"gls""goals":1,"income""equityFixedIncome":"60/40","date""lastModified":"27/10/2019","value""score":0.29},{"id":"goal-5","cName""clientName":"","mName""managerName":"","aName""advisorName":"","gName""goalName":"House Loan","gAmount""goalAmount":23000,"gls""goals":1,"income""equityFixedIncome":"30/70","date""lastModified":"16/6/2022","value""score":0.29}]},{"id":"Client 5","aName""advisorName":"Joe","mName""managerName":"Nikolai","cName""clientName":"Hack Eye","gName""goalName":"Save For World Tour","gAmount""goalAmount":400000,"gls""goals":1,"value""score":0.74,"date""lastModified":"","income""equityFixedIncome":"60/40"},{"id":"Client 6","aName""advisorName":"Joe","mName""managerName":"Nikolai","cName""clientName":"Nick Fury","gName""goalName":"","gAmount""goalAmount":"","gls""goals":2,"value""score":0.44499999999999995,"date""lastModified":"9/3/2022","income""equityFixedIncome":"","rows""subRows":[{"id":"goal-7","cName""clientName":"","mName""managerName":"","aName""advisorName":"","gName""goalName":"To Build A Workspace","gAmount""goalAmount":42340,"gls""goals":1,"income""equityFixedIncome":"60/40","date""lastModified":"9/3/2022","value""score":0.6},{"id":"goal-8","cName""clientName":"","mName""managerName":"","aName""advisorName":"","gName""goalName":"Cloud Examination","gAmount""goalAmount":8730,"gls""goals":1,"income""equityFixedIncome":"30/70","date""lastModified":"9/11/2021","value""score":0.29}]},{"id":"Client 7","aName""advisorName":"Joe","mName""managerName":"Nikolai","cName""clientName":"Star Lord","gName""goalName":"Save For Child Education","gAmount""goalAmount":400000,"gls""goals":1,"value""score":0.93,"date""lastModified":"","income""equityFixedIncome":"55/45"},{"id":"Client 8","aName""advisorName":"Pal","mName""managerName":"Rohan","cName""clientName":"Thanos","gName""goalName":"","gAmount""goalAmount":"","gls""goals":3,"value""score":0.29,"date""lastModified":"2/11/2019","income""equityFixedIncome":"","rows""subRows":[{"id":"goal-10","cName""clientName":"","mName""managerName":"","aName""advisorName":"","gName""goalName":"Relocation Expense Goal","gAmount""goalAmount":400000,"gls""goals":1,"income""equityFixedIncome":"22/78","date""lastModified":"2/11/2019","value""score":0.29},{"id":"goal-11","cName""clientName":"","mName""managerName":"","aName""advisorName":"","gName""goalName":"Save for to buy bike","gAmount""goalAmount":400000,"gls""goals":1,"income""equityFixedIncome":"50/50","date""lastModified":"1/1/2020","value""score":0.29},{"id":"goal-12","cName""clientName":"","mName""managerName":"","aName""advisorName":"","gName""goalName":"Save For Education","gAmount""goalAmount":400000,"gls""goals":1,"income""equityFixedIncome":"65/35","date""lastModified":"9/5/2022","value""score":0.29}]},{"id":"Client 9","aName""advisorName":"Pal","mName""managerName":"Rohan","cName""clientName":"Ego","gName""goalName":"Save For Education","gAmount""goalAmount":400000,"gls""goals":1,"value""score":0.72,"date""lastModified":"","income""equityFixedIncome":"65/35"},{"id":"Client 10","aName""advisorName":"Pal","mName""managerName":"Rohan","cName""clientName":"Bruce Banner","gName""goalName":"","gAmount""goalAmount":"","gls""goals":2,"value""score":0.975,"date""lastModified":"9/10/2018","income""equityFixedIncome":"","rows""subRows":[{"id":"goal-14","cName""clientName":"","mName""managerName":"","aName""advisorName":"","gName""goalName":"Car Loan","gAmount""goalAmount":23000,"gls""goals":1,"income""equityFixedIncome":"60/40","date""lastModified":"9/10/2018","value""score":0.99},{"id":"goal-15","cName""clientName":"","mName""managerName":"","aName""advisorName":"","gName""goalName":"Bike Loan","gAmount""goalAmount":4600,"gls""goals":1,"income""equityFixedIncome":"30/70","date""lastModified":"9/11/2021","value""score":0.96}]}]
function firstLevelRestructure(data){
return data.reduce(
(acc, row) => {
if (row.aNameadvisorName !== acc.level1.cNameclientName) {
let newRow1 = {
aNameadvisorName: row.aNameadvisorName,
mNamemanagerName: row.mNamemanagerName,
id: "",
cNameclientName: "",
gNamegoalName: "",
gAmountgoalAmount: "",
glsgoals: "",
valuescore: "",
datelastModified: "",
incomeequityFixedIncome: "",
rowssubRows: [],
};
acc.result.push(newRow1);
acc.level1.cNameclientName = row.aName;advisorName;
acc.level1.arr = newRow1.rows;subRows;
}
let newRow2 = {
aNameadvisorName: "",
mNamemanagerName: "",
id: row.id,
cNameclientName: row.cNameclientName,
gNamegoalName: row.gNamegoalName,
gAmountgoalAmount: row.gAmountgoalAmount,
glsgoals: row.glsgoals,
valuescore: row.valuescore,
datelastModified: row.datelastModified,
incomeequityFixedIncome: row.incomeequityFixedIncome,
};
if(row.rowssubRows) {
acc.level2.arr = newRow2.rowssubRows = [];
}
acc.level1.arr.push(newRow2);
if (row.rowssubRows) {
row.rowssubRows.forEach((subRow) => {
acc.level2.arr.push({ ...subRow });
});
}
return acc;
},
{
result: [],
level1: { cNameclientName: "", arr: null },
level2: { arr: null },
}
).result;
}
const restructure = (data, keyName) => {
let val = firstLevelRestructure(data)
const emptyNode = {
mNamemanagerName: "",
aNameadvisorName: "",
id: "",
cNameclientName: "",
gNamegoalName: "",
gAmountgoalAmount: "",
glsgoals: "",
valuescore: "",
datelastModified: "",
incomeequityFixedIncome: "",
rowssubRows: [],
};
const groups = val.reduce((acc, item) => {
acc[item[keyName]] ??= [];
acc[item[keyName]].push({ ...item, [keyName]: "" });
return acc;
}, {});
return Object.entries(groups)
.map(([keyValue, rows]subRows]) => (
{ ...emptyNode, [keyName]: keyValue , rowssubRows }
));
};
console.log(JSON.stringify(restructure(data, 'mName''managerName')));
And why am doing this conversion because, we are creating a multi level nested row expansion table which requires this kind of structure. You can get the working demo link here - https://codesandbox.io/s/tanstack-table-expansion-1t77ks?file=/src/styles.css
And the structured data will be used to create the table with the expansion like in the above image.
Here u can see the formatted data - https://codesandbox.io/s/tanstack-table-expansion-1t77ks?file=/src/data/table-data.json
