Skip to content

Instantly share code, notes, and snippets.

@codeBelt
Last active February 6, 2022 19:17
Show Gist options
  • Save codeBelt/7307c35389fe5bfb4949686e1938b487 to your computer and use it in GitHub Desktop.
Save codeBelt/7307c35389fe5bfb4949686e1938b487 to your computer and use it in GitHub Desktop.
// JavaScript Version
export const buildFirstMiddleLastList = (list) => {
const { 0: first, [list.length - 1]: last, ...rest } = list;
return {
first: first,
middle: Object.values(rest),
last: list.length > 1 ? last : undefined,
};
};
const arrayData = ['a', 'b', 'c', 'd', 'e'];
const {first, middle, last} = buildFirstMiddleLastList(arrayData);
first; // "a"
middle; // ["b", "c", "d"]
last; // "e"
// Jest Test
describe('buildFirstMiddleLastList()', () => {
test.each`
input | expected
${[]} | ${{ first: undefined, middle: [], last: undefined }}
${[1]} | ${{ first: 1, middle: [], last: undefined }}
${[1, 2]} | ${{ first: 1, middle: [], last: 2 }}
${[1, 2, 3, 4, 5]} | ${{ first: 1, middle: [2, 3, 4], last: 5 }}
${['a', 'b', 'c', 'd', 'e']} | ${{ first: 'a', middle: ['b', 'c', 'd'], last: 'e' }}
${[{ a: 'a' }, { b: 'b' }, { c: 'c' }]} | ${{ first: { a: 'a' }, middle: [{ b: 'b' }], last: { c: 'c' } }}
`('returns $expected when buildFirstMiddleLastList($input)', ({ expected, input }) => {
expect(buildFirstMiddleLastList(input)).toEqual(expected);
});
});
// TypeScript Version
type UnArray<T> = T extends Array<infer U> ? U : T;
interface IFirstMiddleLastList<T> {
first: UnArray<T> | undefined;
last: UnArray<T> | undefined;
middle: T;
}
export const buildFirstMiddleLastList = <T extends any[]>(list: T): IFirstMiddleLastList<T> => {
const { 0: first, [list.length - 1]: last, ...rest } = list;
return {
first: first,
middle: Object.values(rest) as T,
last: list.length > 1 ? last : undefined,
};
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment