77 lines
2.1 KiB
JavaScript
77 lines
2.1 KiB
JavaScript
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)
|
|
} |