Created
August 31, 2019 15:41
-
-
Save ZackDeRose/c844ddb6a73d2d65ab12ec3909daeb39 to your computer and use it in GitHub Desktop.
This file contains hidden or 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
const COUNT = 10000; | |
interface Hero { | |
heroName: string; | |
heroId: number; | |
} | |
interface AlterEgo { | |
realName: string; | |
heroId: number; | |
} | |
interface RevealedHero { | |
heroName: string; | |
realName: string; | |
} | |
const generateHeroArray = (): Hero[] => | |
Array(COUNT) | |
.fill("") | |
.map((heroName, heroId) => ({ heroName, heroId })); | |
const generateAlterEgoArray = (): AlterEgo[] => | |
Array(COUNT) | |
.fill("") | |
.map((realName, heroId) => ({ realName, heroId })); | |
const combine1 = (heroArr: Hero[], alterEgoArr: AlterEgo[]): RevealedHero[] => | |
heroArr.map(hero => { | |
const alterEgo = alterEgoArr.find(x => x.heroId === hero.heroId); | |
return { | |
heroName: hero.heroName, | |
realName: alterEgo!.realName | |
}; | |
}); | |
const combine2 = ( | |
heroArr: Hero[], | |
alterEgoArr: AlterEgo[] | |
): { [heroId: number]: RevealedHero } => | |
heroArr.reduce( | |
(acc, { heroId, heroName }) => ({ | |
...acc, | |
[heroId]: { ...acc[heroId], heroName } | |
}), | |
alterEgoArr.reduce( | |
(acc, { heroId, realName }) => ({ | |
...acc, | |
[heroId]: { ...acc[heroId], realName } | |
}), | |
{} as { [heroId: number]: RevealedHero } | |
) | |
); | |
const combine3 = (heroes: Hero[], alterEgos: AlterEgo[]): RevealedHero[] => { | |
const heroMap: { [heroId: number]: string } = heroes.reduce( | |
(acc, { heroId, heroName }) => ({ ...acc, [heroId]: heroName }), | |
{} | |
); | |
const alterEgoMap: { [heroId: number]: string } = alterEgos.reduce( | |
(acc, { heroId, realName }) => ({ ...acc, [heroId]: realName }), | |
{} | |
); | |
return heroes.map(({ heroId }) => ({ | |
heroName: heroMap[heroId], | |
realName: alterEgoMap[heroId] | |
})); | |
}; | |
const combine4 = (heroes: Hero[], alterEgos: AlterEgo[]): RevealedHero[] => { | |
const heroMap: { [heroId: number]: string } = {}; | |
heroes.forEach(({ heroId, heroName }) => (heroMap[heroId] = heroName)); | |
const alterEgoMap: { [heroId: number]: string } = {}; | |
alterEgos.forEach(({ heroId, realName }) => (alterEgoMap[heroId] = realName)); | |
return heroes.map(({ heroId }) => ({ | |
heroName: heroMap[heroId], | |
realName: alterEgoMap[heroId] | |
})); | |
}; | |
const combine5 = ( | |
heroArr: Hero[], | |
alterEgoArr: AlterEgo[] | |
): { [heroId: number]: RevealedHero } => | |
heroArr.reduce( | |
(acc, { heroId, heroName }) => { | |
acc[heroId].heroName = heroName; | |
return acc; | |
}, | |
alterEgoArr.reduce( | |
(acc, { heroId, realName }) => { | |
acc[heroId] = { realName } as RevealedHero; | |
return acc; | |
}, | |
{} as { [heroId: number]: RevealedHero } | |
) | |
); | |
const heroes = generateHeroArray(); | |
const alterEgos = generateAlterEgoArray(); | |
console.log(`At ${COUNT} items to combine:`); | |
console.time("combine1"); | |
combine1(heroes, alterEgos); | |
console.timeEnd("combine1"); | |
console.time("combine2"); | |
combine2(heroes, alterEgos); | |
console.timeEnd("combine2"); | |
console.time("combine3"); | |
combine3(heroes, alterEgos); | |
console.timeEnd("combine3"); | |
console.time("combine4"); | |
combine4(heroes, alterEgos); | |
console.timeEnd("combine4"); | |
console.time("combine5"); | |
combine5(heroes, alterEgos); | |
console.timeEnd("combine5"); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment