I’m learning Javascript and getting started with React. I’m attempting to build a Materials-UI’s DataGrid and need to structure my data accordingly. I have the following piece of code that prepares the Rows and Columns for DataGrid but I feel it may be “slow” and wondering if I can get the community’s input on how it can be written more efficiently. Any ideas/solutions would be appreciated. Thanks.
input:
const values = [ { "documentId": "12345", "documentDirectory": "Canadian PnC", "properties": [ { "name": "HoldingNumber", "type": "STRING", "value": "88888", }, { "name": "DocumentType", "type": "STRING", "value": "TAC", }, { "name": "DocumentName", "type": "STRING", "value": "Income", }, ] }, { "documentId": "54321", "documentDirectory": "Wealth", "properties": [ { "name": "HoldingNumber", "type": "STRING", "value": "99999", }, { "name": "DocumentType", "type": "STRING", "value": "TAC", }, { "name": "DocumentName", "type": "STRING", "value": "Appraisal", }, ] } ];
output:
//console.log(cols); [ { field: "DocumentDirectory", headerName: "DocumentDirectory", width: 200 }, { field: "DocumentId", headerName: "DocumentId", width: 200 }, { field: "HoldingNumber", headerName: "HoldingNumber", width: 200 }, { field: "DocumentType", headerName: "DocumentType", width: 200 }, { field: "DocumentName", headerName: "DocumentName", width: 200 } ]
//console.log(rows);
[ { id: 0, DocumentDirectory: "Canadian PnC", DocumentId: "12345", HoldingNumber: "88888", DocumentType: "TAC", DocumentName: "Income"}, { id: 1, DocumentDirectory: "Wealth", DocumentId: "54321", HoldingNumber: "99999", DocumentType: "TAC", DocumentName: "Appraisal" } ]
I’m currently achieving it the using the following:
const docDirectory = values.map(result => result.documentDirectory); const docId = values.map(result => result.documentId); const docProperties = values.map(result => result.properties); let cols= []; let rows= []; for (let i = 0; i < docProperties.length; i++) { const p = docProperties[i]; let o = {}; o["id"] = i; o["DocumentDirectory"] = docDirectory[i]; o["DocumentId"] = docId[i]; if (i === 0) { cols.push({ field: "DocumentDirectory", headerName: "DocumentDirectory", width: 200 }); cols.push({ field: "DocumentId", headerName: "DocumentId", width: 200 }); } for (let j = 0; j < p.length; j++) { let nam = p[j].name; let val = p[j].value; o[nam.replace(/s+/, "")] = val; if (i === 0) { cols.push({ field: nam.replace(/s+/, ""), headerName: nam, width: 200 }); } } rows.push(o); } console.log(cols); console.log(rows);
Advertisement
Answer
const values = [ { documentId: '12345', documentDirectory: 'Canadian PnC', properties: [ { name: 'HoldingNumber', type: 'STRING', value: '88888' }, { name: 'DocumentType', type: 'STRING', value: 'TAC' }, { name: 'DocumentName', type: 'STRING', value: 'Income' } ] }, { documentId: '54321', documentDirectory: 'Wealth', properties: [ { name: 'HoldingNumber', type: 'STRING', value: '99999' }, { name: 'DocumentType', type: 'STRING', value: 'TAC' }, { name: 'DocumentName', type: 'STRING', value: 'Appraisal' } ] } ]; const cols = [ { field: 'DocumentDirectory', headerName: 'DocumentDirectory', width: 200 }, { field: 'DocumentId', headerName: 'DocumentId', width: 200 }, ...values[0].properties.map(p => ({ field: p.name, headerName: p.name, width: 200 })) ]; const rows = values.map((value, index) => { return { id: index, DocumentDirectory: value.documentDirectory, DocumentId: value.documentId, ...value.properties.reduce( (val, cur) => ({ ...val, [cur.name]: cur.value }), {} ) }; }); console.log(cols); console.log(rows);