Skip to content

Instantly share code, notes, and snippets.

@ColadaFF
Created March 11, 2020 13:55
Show Gist options
  • Save ColadaFF/92b43d12e41f42e48aa24f4245622b8e to your computer and use it in GitHub Desktop.
Save ColadaFF/92b43d12e41f42e48aa24f4245622b8e to your computer and use it in GitHub Desktop.
[
{
"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
}
]
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