JSFiddle - React, Tailwind, and code Playground

by jonahe

HTML

<pre id="output">
  
</pre>

JavaScript

const testData = [
  [
    "1.50",
    "Ad-hoc queries or calls",
    "Team 1",
    "James"
  ],
  [
    "2.50",
    "Ad-hoc queries or calls",
    "Team 1",
    "James"
  ],
  [
    "1.00",
    "Advice",
    "Team 2",
    "James"
  ],
  [
    "3.50",
    "Meeting (External 3rd Party)",
    "Team 1",
    "James"
  ],
  [
    "1.20",
    "Administration",
    "Team 2",
    "James"
  ],
  [
    "5.50",
    "Advice",
    "Team 1",
    "John"
  ]
];


const columnIndexByName = {
	TASK_DURATION: 0,
  TASK_NAME: 1,
	FOR_WHICH_TEAM: 2,
	PERSON_DOING_TASK: 3
};

const sum = (acc, nextTime) => acc + nextTime;

const uniqueNames = [...new Set(testData.map(row => row[columnIndexByName.PERSON_DOING_TASK])) ];
const uniqueTaskNames = [...new Set(testData.map(row => row[columnIndexByName.TASK_NAME])) ];

let result = {};

uniqueNames.forEach(personName => {
	const personDataRows = testData.filter(row => row[columnIndexByName.PERSON_DOING_TASK] === personName);
  
  let taskDurationsByTaskName = {};
	
  uniqueTaskNames.forEach(taskName => {
  		const taskRows = personDataRows.filter(row => row[columnIndexByName.TASK_NAME] === taskName);
      const taskDurations = taskRows.map(row => Number.parseFloat( row[columnIndexByName.TASK_DURATION] ));
      const taskTotalDuration = taskDurations.reduce(sum, 0);
      
      taskDurationsByTaskName[taskName] = taskTotalDuration;
  })
  
  result[personName] = taskDurationsByTaskName;
})


const renderData = data => document.querySelector("#output").innerHTML = JSON.stringify(data, null, 2);
renderData(result);