Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

354
Vistas
¿Cómo puede reducir (...) las entradas de un objeto Map de JavaScript sin expandirse a una lista?

Parece que no hay una buena biblioteca estándar para hacer algo como esto.

 let thismap = new Map([[1,2],[2,3]]) console.log(thismap.entries().reduce((prev, [a,b])=>prev + a * b, 0))

Uncaught TypeError: thismap.entries(...).reduce is not a function

Supongo que esto se debe a que la función de entradas () devuelve un iterador. No quiero Array.from(thismap.entries()).reduce(...) , ya que eso generaría innecesariamente la matriz en la memoria. Parece que me estoy perdiendo algo, pero tampoco quiero volver a implementar algo que debería estar en la biblioteca estándar.

Supongo que si estuviera usando un objeto en su lugar (no es una solución satisfactoria aquí por otras razones), las entradas () serían esencialmente una expansión de matriz en lugar de un iterador (aunque supongo que podría implementarse teniendo en cuenta la eficiencia de la memoria). Pero aún así, me gustaría saber cómo reducir un iterador

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Puede usar un bucle for of y manejar la suma manualmente. Esto usa el iterador sin crear una matriz temporal. Tenga en cuenta que aquí ni siquiera tenemos que llamar entries manualmente porque Map.prototype[Symbol.iterator] === Map.prototype.entries .

 const map = new Map([[1, 2], [2, 3]]) let sum = 0 for (const [a, b] of map) sum += a * b console.log(sum)

Por supuesto, también puede incluir esto en una función de utilidad en caso de que lo necesite con más frecuencia. Aquí creé una función lazyReduce que funciona como Array.prototype.reduce pero opera en iterables de cualquier tipo:

 function lazyReduce (originalIterable, callback, initialValue) { let i = 0 let accumulator = initialValue let iterable = originalIterable // This part exists to implement the behavior of reduce without initial value // in the same way Array.prototype.reduce does it if (arguments.length < 3) { iterable = iterable[Symbol.iterator]() const { value, done } = iterable.next() if (done) throw new TypeError('Reduce of empty iterable with no initial value') accumulator = value i++ } for (const element of iterable) { accumulator = callback(accumulator, element, i++, originalIterable) } return accumulator } const map = new Map([[1, 2], [2, 3]]) console.log(lazyReduce(map, (prev, [a, b]) => prev + a * b, 0))

Si quisiera, podría extender los prototipos de Map , Set , etc., es decir, Map.prototype.reduce = function (...args) { return lazyReduce(this, ...args) } . (Nota: algunas otras cosas que devuelven iteradores serían más difíciles de extender, pero aún posibles. Por ejemplo RegExpStringIterator , que no existe como variable global, pero aún puede hacer Object.getPrototypeOf(''.matchAll(/./g)).reduce = ... Ideas similares funcionarían para Generator ).

about 4 years ago · Juan Pablo Isaza Denunciar

0

Tampoco quiero volver a implementar algo que debería estar en la biblioteca estándar.

Realmente debería de hecho. Hay una propuesta para agregarlo: Iterator Helpers . Mientras lo espera, ya puede usar el polyfill que hará que su código original funcione :-)

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda