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

99
Vistas
Devolver indefinido al usar reducir

Considere la siguiente matriz:

 const books = [ { id: 1, name: 'A song of ice and fire', genre: 'Fantasy', author: { name: 'George RR Martin', birthYear: 1948, }, releaseYear: 1991, }, { id: 2, name: 'The lord of the rings', genre: 'Fantasy', author: { name: 'JRR Tolkien', birthYear: 1892, }, releaseYear: 1954, }, { ];

Supongamos que quiero imprimir el libro con el título más largo. Los siguientes trabajos:

 const longestBook = () => { const longestName = books.reduce((accumulator, book) => { if (book.name.length > accumulator.name.length) { return book; } return accumulator; }); return longestName } console.log(longestBook().name);

Mi pregunta es, ¿por qué no puedo devolver book.name / accumulator.name directamente en lugar de usar .name solo al llamar a la función? Si trato de hacerlo, el resultado es indefinido.

 const longestBook = () => { const longestName = books.reduce((accumulator, book) => { if (book.name.length > accumulator.name.length) { return book.name; } return accumulator.name; }); return longestName } console.log(longestBook());
about 4 years ago · Santiago Gelvez
3 Respuestas
Responde la pregunta

0

Si el acumulador se convierte en la propiedad .name , será una cadena simple y ya no tendrá una propiedad .name para comparar en la siguiente iteración.

Debería ser coherente con su tipo de acumulador desde el principio al proporcionar un valor inicial. Una cadena vacía sería suficiente...

 return books.reduce( (acc, { name }) => name.length > acc ? name : acc, "" // initial value );
about 4 years ago · Santiago Gelvez Denunciar

0

Con reduce , está pasando un solo valor, el acumulador, de la iteración anterior a la iteración actual. En devoluciones de llamada reducidas estructuradas decentemente, el acumulador generalmente debe mantener la misma forma durante todo el ciclo, de modo que la lógica se pueda realizar en él de manera predecible y consistente.

Si intenta devolver solo el .name , hay problemas:

 const longestName = books.reduce((accumulator, book) => { if (book.name.length > accumulator.name.length) { return book.name; } return accumulator.name; });

porque

  • Debido a que no proporcionó un valor inicial, el acumulador para la primera iteración será el primer objeto de libro
  • Dentro de la primera iteración, devuelve un .name del primer objeto de libro o del segundo objeto de libro. El nombre es una cadena, por lo que esto da como resultado que el acumulador sea una cadena para la segunda iteración.
  • En la segunda iteración, el acumulador ahora es una cadena, no un objeto de libro, por lo que return accumulator.name no devuelve nada.
about 4 years ago · Santiago Gelvez Denunciar

0

Estará acumulando una cadena en lugar de un objeto, por lo que todo el método reduce() debe estar orientado a eso.

Eso también significa que deberá proporcionar un valor inicial para reduce() . De forma predeterminada, toma el primer valor de la matriz, que es un objeto y no una cadena.

 const books = [{ id: 1, name: 'A song of ice and fire', genre: 'Fantasy', author: { name: 'George RR Martin', birthYear: 1948, }, releaseYear: 1991, }, { id: 2, name: 'The lord of the rings', genre: 'Fantasy', author: { name: 'JRR Tolkien', birthYear: 1892, }, releaseYear: 1954, }]; const longestBook = () => { const longestName = books.reduce((accumulator, { name }) => { if (name.length > accumulator.length) { return name; } return accumulator; }, ''); return longestName; } console.log(longestBook());

about 4 years ago · Santiago Gelvez 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