включает элемент точного совпадения в массивы - PullRequest
1 голос
/ 07 мая 2020

У меня есть список элементов в массиве. Я хочу добавить счетчик как постфикс для каждого элемента по вхождению. Я знаю, что собираюсь использовать сокращение, потому что мне нужно сравнить с предыдущим элементом, но застрял с включениями, потому что это частичное совпадение.

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)

Ответы [ 4 ]

1 голос
/ 07 мая 2020

Вы можете использовать Array.map для обработки вашего массива, ведя подсчет количества раз, когда вы видели каждый тип гостя, и добавляя его к значению в массиве:

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)
0 голосов
/ 07 мая 2020

по-моему ... просто array.map и (вам не нужен какой-либо временный элемент счетчика)

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 голосов
/ 07 мая 2020

Я думаю, что в этом случае имеет смысл сохранить счетчики для каждого пола в объекте, а затем в функции уменьшения, увеличить счет и создать последнюю строку "guestId" из счетчика, хранящегося в объекте.

Этот код достигает желаемого результата:

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 голосов
/ 07 мая 2020

вы совсем близко, нужен только счетчик

    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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...