Add ability to spread Map entries (optimization) (#1612)
This commit is contained in:
@@ -17,5 +17,17 @@ describe('objectSpread', (): void => {
|
||||
).toEqual({ a: 2, b: 2, c: { d: 3, e: 4 } });
|
||||
});
|
||||
|
||||
perf('objectSpread', 500_000, [[]], () => objectSpread({}, { a: 1, b: 2, c: 3 }, { d: 4, e: 7, f: 6 }));
|
||||
it('spreads a Map', (): void => {
|
||||
const map = new Map<string, string>([['foo', '123']]);
|
||||
|
||||
expect(
|
||||
objectSpread({ bar: '123' }, map)
|
||||
).toEqual({
|
||||
bar: '123',
|
||||
foo: '123'
|
||||
});
|
||||
});
|
||||
|
||||
perf('objectSpread', 350_000, [[{}, { a: 1, b: 2, c: 3 }, { d: 4, e: 7, f: 6 }]], objectSpread);
|
||||
perf('objectSpread', 350_000, [[{}, new Map<string, number>([['a', 1], ['b', 2], ['c', 3]]), new Map<string, number>([['d', 4], ['e', 5], ['f', 6]])]], objectSpread);
|
||||
});
|
||||
|
||||
@@ -10,7 +10,13 @@ export function objectSpread <T extends object> (dest: object, ...sources: (obje
|
||||
const src = sources[i];
|
||||
|
||||
if (src) {
|
||||
Object.assign(dest, src);
|
||||
if ((src as Map<unknown, unknown>).entries) {
|
||||
for (const [key, value] of (src as Map<string, unknown>).entries()) {
|
||||
(dest as Record<string, unknown>)[key] = value;
|
||||
}
|
||||
} else {
|
||||
Object.assign(dest, src);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -39,19 +39,23 @@ ${formatFixed(ops).padStart(NUM_PAD + PRE_PAD + 1)} ops/s
|
||||
${formatFixed(micro).padStart(NUM_PAD + PRE_PAD + 1)} μs/op`;
|
||||
}
|
||||
|
||||
export function perf (name: string, count: number, inputs: readonly unknown[][], exec: ExecFn): void {
|
||||
export function perf (name: string, count: number, inputs: readonly unknown[][], exec: ExecFn, withLog?: boolean): void {
|
||||
if (process.env.GITHUB_REPOSITORY) {
|
||||
return;
|
||||
}
|
||||
|
||||
it(`performance: ${name}`, (): void => {
|
||||
const [time] = loop(count, inputs, exec);
|
||||
const [time, results] = loop(count, inputs, exec);
|
||||
|
||||
console.log(`
|
||||
performance run for ${name} completed with ${formatNumber(count)} iterations.
|
||||
|
||||
${`${name}:`.padStart(PRE_PAD)} ${time.toFixed(2).padStart(NUM_PAD)} ms${formatOps(count, time)}
|
||||
`);
|
||||
|
||||
if (withLog) {
|
||||
console.log(results);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user