ProviderFte Reduce with Lodash

Reduces the ProviderFte summary data using lodash to display the FTE and RVU listings in a single row client-side.

by Michael Perrenoud

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

JavaScript

console.clear();

var url = 'https://s3-us-west-2.amazonaws.com/jsfiddle-data/ProviderFteLodash.json';

fetch(url)
  .then(res => {
    res.json()
      .then(data => {
      	const start = new Date();
        const yearMonthList = _.uniq(_.map(data, 'YearMonth'));

        const min = _.min(yearMonthList);
        const max = _.max(yearMonthList);

        const groups = _.groupBy(data, 'ReportProvFnbr');

        const reduced = _.reduce(groups,
          (result, value, key) => {
            const reducedReportProv = _.reduce(value,
              (res, val) => {
                if (!res.ReportProvFnbr) {
                  res = _.omit(val, ['Fte', 'RvuTarget']);
                }

                res[`fte${val.YearMonth}`] = val.Fte;
                res[`rvu${val.YearMonth}`] = val.RvuTarget;

                return res;
              }, {});

            result.push(reducedReportProv);

            return result;
          }, []);
        
        console.log('reduced', reduced);
        
        const filtered = _.filter(reduced, o => {
        	const fteKeys = _.filter(_.keys(o), k => k.startsWith('fte'));
          return _.every(fteKeys, k => !o[k]);
        });

				const stop = new Date();
        console.log('reduced and filtered', filtered, `in ${stop.getTime() - start.getTime()}ms`);
      });
  })
  .catch(err => {
    alert('Failed.');
    console.error(err);
  });