Skip to content

Instantly share code, notes, and snippets.

@ChuckJonas
Created December 1, 2017 05:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ChuckJonas/fe3b96d78cd008f8b012b2408b59a5f4 to your computer and use it in GitHub Desktop.
Save ChuckJonas/fe3b96d78cd008f8b012b2408b59a5f4 to your computer and use it in GitHub Desktop.
Generic Skill Challenge
//an alternate (and perhaps better approach)
interface IWeightedItem{
weight: number
}
interface Grade extends IWeightedItem{
score: number;
}
interface Product extends IWeightedItem{
price: number;
}
enum HitType {
noHitter,
single,
double,
triple,
homerun
}
interface BaseballHitRecord extends IWeightedItem{
hit: HitType
}
const weightedAverage = <T extends IWeightedItem>(arr: T[], valueSelector: (item: T) => number) => {
let totalWeight = 0;
let totalValue = 0;
for (let item of arr) {
totalWeight += item.weight;
totalValue += item.weight * valueSelector(item);
}
return totalValue / totalWeight;
}
let grades: Grade[] = [
{
weight: 3,
score: 100
},
{
weight: 1,
score: 60
},
{
weight: 1,
score: 20
},
{
weight: 1,
score: 40
},
];
const test = (value: number, expected: number) => {
if (value === expected) {
alert('pass!')
} else {
alert('fail!')
}
}
let weightedGrades = weightedAverage(grades, (grade) => grade.score);
test(weightedGrades, 70);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment