Tengo el siguiente fragmento de javascript:
/** * Returns the maximal element in the `iterable` as calculated by the given function * @param {Iterable} iterable - iterable to find the maximal element in * @param {function} fn - function to calculate the maximal element * * @returns {any} - maximal element in the `iterable` */ function maxBy(iterable, fn) { let maximalElement = iterable[0]; for (let element of iterable) { if (fn(element) > fn(maximalElement)) { maximalElement = element; } } return maximalElement; } // example generator function generator = function* () { yield [3,4] yield [4,6] } maxBy(generator(), element => element[1]) Cuando ejecuto esto en la consola del navegador, obtengo Uncaught TypeError: element is undefined y parece que no puedo detectar dónde está el error en mi código.
No puede usar iterable[0] para acceder al primer elemento en un generador. Deberá obtener el iterador e iterarlo:
function maxBy(iterable, fn) { const iterator = iterable[Symbol.iterator](); const first = iterator.next(); if (first.done) return; let maximalElement = first.value; for (let element of iterator) { if (fn(element) > fn(maximalElement)) { maximalElement = element; } } return maximalElement; } Alternativamente, simplemente inicialice maximalElement con undefined , esto podría suceder de todos modos si el iterable está vacío:
function maxBy(iterable, fn) { let maximalElement; for (let element of iterable) { if (maximalElement === undefined || fn(element) > fn(maximalElement)) { maximalElement = element; } } return maximalElement; }