Tengo una lista de elementos en una matriz. Quiero agregar recuento como postfix en cada elemento por ocurrencia. Sé que voy a usar reducir porque tengo que comparar con el elemento anterior, pero me quedo con incluye porque es una coincidencia parcial.

const guest = ["male", "male", "female"]
const r = guest.reduce((accum, g, index) => {

    if(accum.includes(g)) {
        g = g + (index+1)
    } else {
        g = g + index
    }

    accum = [...accum, g]
    return accum

}, []) //expect to be [male1, male2, female1]

console.log('r', r)
1
akibo 7 may. 2020 a las 06:50

4 respuestas

La mejor respuesta

Puede usar Array.map para procesar su matriz, manteniendo un recuento del número de veces que ha visto cada tipo de invitado y agregando eso al valor en la matriz:

const guest = ["male", "male", "female"]

let counts = {}
const r = guest.map(g => {
  counts[g] = (counts[g] || 0) + 1;
  return g + counts[g];
});

console.log('r', r)
1
Nick 7 may. 2020 a las 04:05

Creo que en este caso puede tener más sentido almacenar los recuentos para cada género en un objeto, luego dentro de la función de reducción, incrementar el recuento y crear su cadena final "guestId" a partir del recuento almacenado en el objeto.

Este código logra el resultado deseado:

const guest = ["male", "male", "female"]
const counts = { male: 0, female: 0}
const r = guest.reduce((accum, g, index) => {

  counts[g] += 1
  const guestId = `${g}${counts[g]}`
  accum.push(guestId)
  return accum

}, []) //expect to be [male1, male2, female1]

console.log('r', r)
0
Rexovas 7 may. 2020 a las 04:33

Mi manera...

const guest = ["male", "male", "female"]
const r = guest.map((c,i,t)=>c+(t.filter((el,ix)=>el===c && ix<i).length +1))

console.log( r.join(' / ') )
0
Mister Jojo 7 may. 2020 a las 04:33

Estás muy cerca, solo necesitas un mostrador

    const guest = ["male", "male", "female"]
    let male = 1;
    let female = 1;
    const r = guest.reduce((accum, g) => {
      if (g === 'male') {
        accum.push(g + male++)
      } else {
        accum.push(g + female++)
      }
      return accum;
    }, []);

    console.log('r', r)
0
D. Seah 7 may. 2020 a las 04:09