Created
March 11, 2020 13:55
-
-
Save ColadaFF/92b43d12e41f42e48aa24f4245622b8e to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
[ | |
{ | |
"category": "C", | |
"price": 539.0772150437717 | |
}, | |
{ | |
"category": "B", | |
"price": 743.6677612263602 | |
}, | |
{ | |
"category": "A", | |
"price": 275.2065639795811 | |
}, | |
{ | |
"category": "B", | |
"price": 912.7750179381753 | |
}, | |
{ | |
"category": "C", | |
"price": 416.7595315030992 | |
}, | |
{ | |
"category": "C", | |
"price": 891.8110658837174 | |
}, | |
{ | |
"category": "C", | |
"price": 138.9733737849883 | |
}, | |
{ | |
"category": "C", | |
"price": 596.8529572177353 | |
}, | |
{ | |
"category": "C", | |
"price": 158.57450856771948 | |
}, | |
{ | |
"category": "C", | |
"price": 706.449897751821 | |
}, | |
{ | |
"category": "B", | |
"price": 382.21079583645735 | |
}, | |
{ | |
"category": "C", | |
"price": 650.9998017936671 | |
}, | |
{ | |
"category": "B", | |
"price": 809.8615405964318 | |
}, | |
{ | |
"category": "A", | |
"price": 957.5352782964179 | |
}, | |
{ | |
"category": "A", | |
"price": 773.41642359315 | |
}, | |
{ | |
"category": "B", | |
"price": 729.8269145774594 | |
}, | |
{ | |
"category": "C", | |
"price": 116.13727979157717 | |
}, | |
{ | |
"category": "B", | |
"price": 214.61693437388485 | |
}, | |
{ | |
"category": "A", | |
"price": 286.6148036611407 | |
}, | |
{ | |
"category": "C", | |
"price": 798.6981083990146 | |
}, | |
{ | |
"category": "B", | |
"price": 575.3016729126446 | |
}, | |
{ | |
"category": "C", | |
"price": 545.8248639019607 | |
}, | |
{ | |
"category": "B", | |
"price": 526.5525069963899 | |
}, | |
{ | |
"category": "B", | |
"price": 978.8372701271397 | |
}, | |
{ | |
"category": "A", | |
"price": 680.1551976430187 | |
}, | |
{ | |
"category": "B", | |
"price": 354.89468096599296 | |
}, | |
{ | |
"category": "A", | |
"price": 567.5869633266133 | |
}, | |
{ | |
"category": "C", | |
"price": 944.8486361405011 | |
}, | |
{ | |
"category": "B", | |
"price": 302.22437625980024 | |
}, | |
{ | |
"category": "B", | |
"price": 357.2259674369997 | |
}, | |
{ | |
"category": "B", | |
"price": 428.92786312710143 | |
}, | |
{ | |
"category": "C", | |
"price": 447.8332985153 | |
}, | |
{ | |
"category": "A", | |
"price": 38.64510777757335 | |
}, | |
{ | |
"category": "B", | |
"price": 783.6139947695449 | |
}, | |
{ | |
"category": "B", | |
"price": 908.5522126582788 | |
}, | |
{ | |
"category": "B", | |
"price": 429.51677739937446 | |
}, | |
{ | |
"category": "C", | |
"price": 602.5169068896299 | |
}, | |
{ | |
"category": "A", | |
"price": 52.22328414623001 | |
}, | |
{ | |
"category": "C", | |
"price": 330.15414877554906 | |
}, | |
{ | |
"category": "C", | |
"price": 449.21646275320626 | |
}, | |
{ | |
"category": "B", | |
"price": 895.6771000924999 | |
}, | |
{ | |
"category": "A", | |
"price": 794.3466005297684 | |
}, | |
{ | |
"category": "A", | |
"price": 609.0891839643986 | |
}, | |
{ | |
"category": "C", | |
"price": 463.32623614025306 | |
}, | |
{ | |
"category": "B", | |
"price": 377.3541793886579 | |
}, | |
{ | |
"category": "A", | |
"price": 137.92758111392266 | |
}, | |
{ | |
"category": "A", | |
"price": 530.1171121336716 | |
}, | |
{ | |
"category": "A", | |
"price": 697.1259364020708 | |
}, | |
{ | |
"category": "A", | |
"price": 43.06132777960636 | |
}, | |
{ | |
"category": "A", | |
"price": 418.045061940556 | |
}, | |
{ | |
"category": "B", | |
"price": 30.008411006383405 | |
}, | |
{ | |
"category": "A", | |
"price": 573.9415549108637 | |
}, | |
{ | |
"category": "C", | |
"price": 738.7188581934994 | |
}, | |
{ | |
"category": "B", | |
"price": 309.510529350725 | |
}, | |
{ | |
"category": "A", | |
"price": 345.7877707437882 | |
}, | |
{ | |
"category": "A", | |
"price": 506.571759259907 | |
}, | |
{ | |
"category": "B", | |
"price": 974.2188335208195 | |
}, | |
{ | |
"category": "B", | |
"price": 743.348573151069 | |
}, | |
{ | |
"category": "C", | |
"price": 979.7731595950072 | |
}, | |
{ | |
"category": "A", | |
"price": 746.9749896679157 | |
}, | |
{ | |
"category": "C", | |
"price": 624.0546579285733 | |
}, | |
{ | |
"category": "B", | |
"price": 780.7058331846932 | |
}, | |
{ | |
"category": "A", | |
"price": 983.6347277285857 | |
}, | |
{ | |
"category": "C", | |
"price": 297.2411390762917 | |
}, | |
{ | |
"category": "A", | |
"price": 296.9615689686642 | |
}, | |
{ | |
"category": "B", | |
"price": 633.4689361334154 | |
}, | |
{ | |
"category": "A", | |
"price": 859.7382589815377 | |
}, | |
{ | |
"category": "A", | |
"price": 791.9271210992722 | |
}, | |
{ | |
"category": "B", | |
"price": 264.84403806692455 | |
}, | |
{ | |
"category": "C", | |
"price": 899.0029535397846 | |
}, | |
{ | |
"category": "C", | |
"price": 283.80731457448974 | |
}, | |
{ | |
"category": "B", | |
"price": 260.44876675687533 | |
}, | |
{ | |
"category": "A", | |
"price": 779.9125567757485 | |
}, | |
{ | |
"category": "C", | |
"price": 358.02406008792076 | |
}, | |
{ | |
"category": "B", | |
"price": 854.2759287339275 | |
}, | |
{ | |
"category": "B", | |
"price": 301.42057155898794 | |
}, | |
{ | |
"category": "A", | |
"price": 102.26667985240034 | |
}, | |
{ | |
"category": "C", | |
"price": 259.7004047505851 | |
}, | |
{ | |
"category": "C", | |
"price": 816.3981645511957 | |
}, | |
{ | |
"category": "B", | |
"price": 149.44393905611176 | |
}, | |
{ | |
"category": "A", | |
"price": 589.4355309019919 | |
}, | |
{ | |
"category": "A", | |
"price": 496.6274360942371 | |
}, | |
{ | |
"category": "A", | |
"price": 4.907893026423249 | |
}, | |
{ | |
"category": "C", | |
"price": 714.1830057520871 | |
}, | |
{ | |
"category": "C", | |
"price": 797.9285362755708 | |
}, | |
{ | |
"category": "A", | |
"price": 102.70547464537749 | |
}, | |
{ | |
"category": "C", | |
"price": 339.77234358701213 | |
}, | |
{ | |
"category": "A", | |
"price": 39.251131169554476 | |
}, | |
{ | |
"category": "C", | |
"price": 304.1441021186415 | |
}, | |
{ | |
"category": "C", | |
"price": 811.1514293231301 | |
}, | |
{ | |
"category": "B", | |
"price": 203.3173392174339 | |
}, | |
{ | |
"category": "A", | |
"price": 520.6830106151288 | |
}, | |
{ | |
"category": "B", | |
"price": 475.55166365638837 | |
}, | |
{ | |
"category": "B", | |
"price": 556.6855071812453 | |
}, | |
{ | |
"category": "C", | |
"price": 973.4023443610911 | |
}, | |
{ | |
"category": "A", | |
"price": 610.2753003273295 | |
}, | |
{ | |
"category": "A", | |
"price": 891.4954601272102 | |
}, | |
{ | |
"category": "A", | |
"price": 258.2465008424231 | |
}, | |
{ | |
"category": "A", | |
"price": 864.8811397903327 | |
}, | |
{ | |
"category": "A", | |
"price": 489.0261788425223 | |
} | |
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function groupMapReduce2(groupFunction){ | |
return function mapFunction(mapFn) { | |
return function reduceFunction(reduceFn) { | |
return function run(collection) { | |
} | |
} | |
} | |
} | |
const groupMapReduce1 = groupFn => mapFn => reduceFn => collection => { | |
} | |
function groupBy(collection, keyFunction) { | |
let acc = {}; | |
collection.forEach(currentElement => { | |
const group = keyFunction(currentElement); | |
const currentListForGroup = acc[group] || []; | |
const listUpdate = [...currentListForGroup, currentElement]; | |
acc[group] = listUpdate | |
}); | |
return acc; | |
} | |
function groupByUsingReduce(collection, keyFunction) { | |
const initialValue = {}; | |
return collection.reduce((acc, currentElement) => { | |
const group = keyFunction(currentElement); | |
const currentListForGroup = acc[group] || []; | |
const listUpdate = [...currentListForGroup, currentElement]; | |
return Object.assign({}, acc, { | |
[group]: listUpdate | |
}); | |
}, initialValue); | |
} | |
function mapValues(object, transformCollection) { | |
const entries = Object.entries(object); | |
/** | |
* [ | |
* [A, [products...]], | |
* [B, [products...]] | |
* ] | |
*/ | |
return entries.map(entry => { | |
const [key, values] = entry; | |
const mappedValues = transformCollection(values); // [prices ...] | |
return { | |
key, | |
values: mappedValues | |
} | |
}) | |
.reduce((acc, currentElement) => { | |
const {key, values} = currentElement; | |
return Object.assign({}, acc, { | |
[key]: values | |
}); | |
}, {}); | |
} | |
const groupMapReduce = (collection, groupFn, mapFn, reduceFn) => { | |
/** | |
* [products...] | |
* group | |
* {A: [product, p...], B: [...]} | |
* map | |
* {A: [prices...], B: [prices...]} | |
* reduce | |
* {A: averageOfA, B: averageOfB, ...} | |
*/ | |
const groups = groupByUsingReduce(collection, groupFn); | |
const mapValuesTransform = elements => elements.map(mapFn); | |
const mappedGroups = mapValues(groups, mapValuesTransform); | |
const reduceGroups = mapValues(mappedGroups, reduceFn); | |
return reduceGroups; | |
} | |
const products = [ | |
{ | |
category: "A", | |
price: 10.2 | |
}, | |
{ | |
category: "B", | |
price: 10.2 | |
}, | |
{ | |
category: "C", | |
price: 10.2 | |
} | |
]; | |
const getProductCategory = product => product.category; | |
const getProductPrice = product => product.price; | |
const calculateAverage = products => { // [10.2, 3.1, 4.5] | |
const initialValue = 0; | |
const length = products.length; | |
/** | |
* += | |
* 1. assignacion => acc = | |
* 2. retorno => suma acc + current | |
*/ | |
const sum = products.reduce((acc, element) => { | |
return acc + element | |
}, initialValue) | |
/** | |
* [10.2, 3.1, 4.5] | |
* | |
* 1. acc: 0, element: 10.2 | |
* 2. acc: 10.2 element: 3.1 | |
* 3. acc: 13.3 element: 4.5 | |
* result = 17.8 | |
*/ | |
const average = sum / length; | |
return average; | |
} | |
const categoryAverages = groupMapReduce( | |
dataset, | |
getProductCategory, // group | |
getProductPrice, // map | |
calculateAverage // reduce | |
); | |
const categoryCounts = groupMapReduce( | |
dataset, | |
getProductCategory, | |
() => 1, | |
products => products.reduce((acc, current) => acc + current, 0) | |
); | |
/** | |
* { | |
* CategoryName: averageOfCategory[Number], | |
* | |
* } | |
*/ | |
console.log(JSON.stringify({categoryAverages, categoryCounts}, null, 3)); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment