Skip to content

Instantly share code, notes, and snippets.

@ZackDeRose
Created August 31, 2019 15:41
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 ZackDeRose/c844ddb6a73d2d65ab12ec3909daeb39 to your computer and use it in GitHub Desktop.
Save ZackDeRose/c844ddb6a73d2d65ab12ec3909daeb39 to your computer and use it in GitHub Desktop.
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