const _ = require('lodash') const fs = require('fs') exports.transform = (data, regions) => { // get data // let data = JSON.parse(fs.readFileSync('transformer-test.json')); const types = Object.keys(data[0].scores) // STEP 1 Create Response Array with region names from first climate object let byRegion = regions.map(el => { // return el return { region_id: el.region_id, name: el.name, country: el.country, } }) // let byRegion = getRegions().map(el => { // // return el // return { // region_id: el.region_id, // name: el.name, // country: el.country, // } // }) // STEP 2 Prepare flat scoreobject array and set days property scoreObjs = _.flatten(_.map(data, (period) => { return _.reduce(period.scores, (arr, el) => { return arr.concat(el) }).map(element => { element.days = period.days return element }) })) // STEP 3 Collect scoreobjects for each region let results = byRegion.map(region => { let scores = [] types.forEach(typ => { let tempScores = _.filter(scoreObjs, { 'region_id': region.region_id, 'type': typ }) if (_.some(tempScores, { 'score': null })) { console.log("found 'null' scores! skipping...") console.log(tempScores) return } let averagedScore = { region_id: region.region_id, type: typ, value: 0, score: 0, days: 0 } tempScores.forEach(el => { averagedScore.value += (el.value * el.days) averagedScore.score += (el.score * el.days) averagedScore.days += (el.days) }) averagedScore.value = _.round(averagedScore.value / averagedScore.days, 1) averagedScore.score = _.round(averagedScore.score / averagedScore.days, 1) delete averagedScore.region_id delete averagedScore.days scores.push(averagedScore) }) region.scores = scores // STEP 4 Calculate Average Score region.score = calculateAverage(region.scores) //console.log(region) return region }) // console.log(results) return _.orderBy(results, ({ score }) => score || 0, 'desc') //.filter(el => !_.isNaN(el.score)) //end } function calculateAverage(scores) { let sum = 0 scores.forEach(el => sum += el.score) //console.log(sum) return _.round(sum / scores.length, 2) }