Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

349
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda