DEV Community

Cristian Fernando
Cristian Fernando

Posted on

 

Advent.js🎅🏼| #2: ¡Ayuda al elfo a listar los regalos!

¡Ayuda al elfo a listar los regalos!

Te ha llegado una carta ✉️ con todos los regalos que debes preparar. El tema es que es una cadena de texto y es muy difícil de leer 😱. ¡Menos mal que han puesto cada regalo separado por espacio! (aunque ten cuidado, porque al ser niños, igual han colado más espacios de la cuenta)

Encima nos hemos dado cuenta que algunas palabras vienen con un _ delante de la palabra, por ejemplo _playstation, que significa que está tachado y no se tiene que contar.

Transforma el texto a un objeto que contenga el nombre de cada regalo y las veces que aparece. Por ejemplo, si tenemos el texto:

const carta = 'bici coche balón _playstation bici coche peluche'
Enter fullscreen mode Exit fullscreen mode

Al ejecutar el método debería devolver lo siguiente:

const regalos = listGifts(carta)

console.log(regalos)
/*
{
  bici: 2,
  coche: 2,
  balón: 1,
  peluche: 1
}
*/
Enter fullscreen mode Exit fullscreen mode

Ten en cuenta que los tests pueden ser más exhaustivos... 😝 ¡Cuidado con contar espacios vacíos!

Completa el reto!


Mi solución:


Puedes seguir a @midudev y estar pendiente de los retos de Advent.js

Top comments (7)

Collapse
 
jungus80 profile image
Jungus80 • Edited

Hola, mi respuesta

const carta = 'bici coche balón _playstation bici coche peluche'

function liftGift(letter){
const arrayGifts = letter.split(' ')
const cuenta ={}

const filterArray  = arrayGifts.filter(gift => /^(?!_)/.test(gift))


for ( const num of filterArray){
    cuenta[num] = cuenta [num] ? cuenta [num] +1 :1
}
return cuenta
Enter fullscreen mode Exit fullscreen mode

}

Collapse
 
duxtech profile image
Cristian Fernando

genial respuesta!

Collapse
 
marquimark profile image
Marquimark

Hola, adjunto mi respuesta al segundo reto, muchas gracias.

const carta = 'bici coche playStation peluche _almidon balón _playstation bici coche peluche';

function filtrada( carta ){
const separado = carta.toLowerCase().trim().split(' ');
let newData = separado.slice();
let chartNoInclude = /^_/;

const dataLimpia = newData.filter( ( palabras, index ) => {
return !chartNoInclude.test( palabras );

});

return dataLimpia.reduce((previewValue , currentValue) => {
previewValue[currentValue] = (previewValue[currentValue] ||0 ) +1
return previewValue;
},{});

}

console.log( filtrada( carta ));

Collapse
 
jcodemarker profile image
JCode-marker

Mi solución es esta:
const listGifts = (letter) => {
const list = letter.split(' ');
const listGifts = {};
list.forEach(element => {
if (element.charAt(0) === '_') {
return;
}
if (listGifts[element]) {
listGifts[element]++;
} else {
listGifts[element] = 1;
}
});
return listGifts;
}

Collapse
 
thewuiz profile image
Luis Angel Lopez • Edited

Hola a todos, soy nuevo en esto jeje, adjunto mi respuesta al segundo reto:

function listGifts(letter) {
let carta = new Object()
letter = letter.trim().split("")
letter.forEach((l) => {
carta[l] ? (carta[l] = carta[l] + 1) : l === "" || l.includes('_') ? "" : (carta[l] = 1)
})
return carta
}

Collapse
 
kylety1990 profile image
kylety1990

const carta = 'bici coche balón _playstation bici coche peluche';

const objCard= {};
const cleanCard= carta.split(' ').filter(a => a && !a.includes('_'));

cleanCard.reduce((acc,value) => !objCard.hasOwnProperty(value) ? objCard[value] = 1 : objCard[value]++, cleanCard[0])

console.log(objCard);

Collapse
 
alexjamesmx profile image
Alejandro Santiago • Edited

Mi solucion:

export default function listGifts(letter) {
const arr = letter.split(' ');
const arrFiltered = arr.filter(word => word.charAt(0) !== "_").filter(word => word.trim())
const result = {}
arrFiltered.forEach(gift => {
result[gift] = (result[gift] || 0) + 1
})
return result
}

Need a better mental model for async/await?

Check out this classic DEV post on the subject.

⭐️🎀 JavaScript Visualized: Promises & Async/Await

async await