Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

356
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!