Array.prototype.map = undefined Array.prototype.flatMap = undefined Array.prototype.flat = undefined // /*/ // ⚡ export const tests = [] const t = (f) => tests.push(f) const add1 = (el) => el + 1 const sub3 = (el) => el - 3 const mult2 = (el) => el * 2 const doAll = (el) => sub3(mult2(add1(el))) const posValsIndex = (el, i) => (el >= 0 ? `${i}: ${el}` : undefined) const indexValsArray = (el, i, arr) => `${el} is at index: ${i} out of ${arr.length - 1}` const arrayFormatSentence = (item, index, arr) => { if (index === arr.length - 2) return `and ${arr[arr.length - 2]} ` if (index === arr.length - 1) { return `are ${String(arr.length - 1)} ${item}.` } return `${item}, ` } // map t(({ eq, ctx }) => eq(map(ctx.numbers, add1), [11, -9, 21, -94, 87, 103, 36, 90, 111]), ) t(({ eq, ctx }) => eq(map(ctx.numbers, mult2), [20, -20, 40, -190, 172, 204, 70, 178, 220]), ) t(({ eq, ctx }) => eq(map(ctx.numbers, sub3), [7, -13, 17, -98, 83, 99, 32, 86, 107]), ) t(({ eq, ctx }) => eq(map(ctx.numbers, doAll), [19, -21, 39, -191, 171, 203, 69, 177, 219]), ) t(({ eq, ctx }) => eq(map(ctx.numbers, posValsIndex), [ '0: 10', undefined, '2: 20', undefined, '4: 86', '5: 102', '6: 35', '7: 89', '8: 110', ]), ) t(({ eq, ctx }) => eq(map(ctx.numbers, indexValsArray), [ '10 is at index: 0 out of 8', '-10 is at index: 1 out of 8', '20 is at index: 2 out of 8', '-95 is at index: 3 out of 8', '86 is at index: 4 out of 8', '102 is at index: 5 out of 8', '35 is at index: 6 out of 8', '89 is at index: 7 out of 8', '110 is at index: 8 out of 8', ]), ) t(({ eq, ctx }) => eq( map(ctx.sentences[0], arrayFormatSentence).join(''), 'Colombia, Mexico, and El Salvador are 3 Spanish speaking countries.', ), ) t(({ eq, ctx }) => eq( map(ctx.sentences[1], arrayFormatSentence).join(''), 'Perou, Brazil, Argentina, and Venezuela are 4 countries in South America.', ), ) t(({ eq, ctx }) => eq( map(ctx.sentences[2], arrayFormatSentence).join(''), 'France, Portugal, and Italy are 3 members of the EU.', ), ) t(({ eq, ctx }) => // map should not flat eq( map([1, 2, 3], n => [n, n]), [ [1, 1], [2, 2], [3, 3], ], ), ) // flatMap t(({ eq, ctx }) => // flatMap should flatten the result of map eq( flatMap([1, 2, 3], n => [n, n]), [1, 1, 2, 2, 3, 3], ), ) t(({ eq, ctx }) => eq(flatMap(ctx.mixed, add1), ['101', -9, 21, -94, 87, '1021', '35,891', 111]), ) t(({ eq, ctx }) => eq(flatMap(ctx.mixed, posValsIndex), [ '0: 10', undefined, '2: 20', undefined, '4: 86', '5: 102', undefined, '7: 110', ]), ) t(({ eq, ctx }) => eq(flatMap(ctx.nested, indexValsArray), [ '5 is at index: 0 out of 7', '4 is at index: 1 out of 7', '-3 is at index: 2 out of 7', '20 is at index: 3 out of 7', '17 is at index: 4 out of 7', '-33 is at index: 5 out of 7', '-4 is at index: 6 out of 7', '18 is at index: 7 out of 7', ]), ) Object.freeze(tests) export const setup = () => { const numbers = [10, -10, 20, -95, 86, 102, 35, 89, 110] const mixed = [[10], -10, 20, -95, 86, [102], [35, 89], 110] const nested = [[5], [4], [-3], [20], [17], [-33], [-4], [18]] const sentences = [ ['Colombia', 'Mexico', 'El Salvador', 'Spanish speaking countries'], ['Perou', 'Brazil', 'Argentina', 'Venezuela', 'countries in South America'], ['France', 'Portugal', 'Italy', 'members of the EU'], ] Object.getPrototypeOf([]).proto = ' [avoid for..in] ' Object.freeze(numbers) Object.freeze(mixed) Object.freeze(nested) Object.freeze(sentences[0]) Object.freeze(sentences[1]) Object.freeze(sentences[2]) return { numbers, mixed, nested, sentences } }