export function getItems(data) { let filteredData = data.filter((metric) => { return metric.Value !== 'nan'; }); let transform = filteredData.map((metric) => { let date = new Date(metric.Timestamp); return { ...metric, Timestamp: { time: date.getHours() + ':' + String(date.getMinutes()).padStart(2, '0'), date: formatDate(date), }, Value: Math.round(metric.Value), }; }); let group = transform.reduce(function (rv, x) { (rv[x['Sensor']] = rv[x['Sensor']] || []).push(x); return rv; }, {}); return Object.keys(group).map((metric) => { return { name: metric, current: group[metric][group[metric].length - 1].Value, middle: findAverage(group[metric]), min: findMin(group[metric]), minDate: findDateOfMin(group[metric]), max: findMax(group[metric]), maxDate: findDateOfMax(group[metric]), }; }); } function padTo2Digits(num) { return num.toString().padStart(2, '0'); } function formatDate(date) { return [ padTo2Digits(date.getDate()), padTo2Digits(date.getMonth() + 1), date.getFullYear(), ].join('.'); } function findAverage(arr) { const { length } = arr; return Math.round( arr.reduce((acc, val) => { return acc + val.Value / length; }, 0) ); } function findMin(arr) { return arr.reduce((min, p) => (p.Value < min ? p.Value : min), arr[0].Value); } function findMax(arr) { return arr.reduce((max, p) => (p.Value > max ? p.Value : max), arr[0].Value); } function findDateOfMin(arr) { return arr.reduce((res, obj) => (obj.Value < res.Value ? obj : res)) .Timestamp; } function findDateOfMax(arr) { return arr.reduce((res, obj) => (obj.Value > res.Value ? obj : res)) .Timestamp; }