const _ = require('lodash') const fs = require('fs') exports.transform = (data) => { // 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 = data[0].climate.map(el => { return { region_id: el.region_id, country_id: el.country_id, name: el.name, } }) // 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', 'desc') //end } function calculateAverage(scores) { let sum = 0 scores.forEach(el => sum += el.score) //console.log(sum) return _.round(sum / scores.length, 2) }