Как преобразовать повторяющиеся числа в соответствующие пары число-буква?

#javascript

#javascript

Вопрос:

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

Вот пример:

 0 => 'Step 1A'
0 => 'Step 1B'
0 => 'Step 1C'
1 => 'Step 2'
2 => 'Step 3A'
2 => 'Step 3B'
3 => 'Step 4'
 

Вот что я пробовал:

 let steps = [0, 0, 0, 1, 1, 2, 3, 4, 5, 5]
let stepCount = new Map()

steps = steps.map(step => {
  stepCount[step] = stepCount[step]   1 || 0
  return 'Step '   (step 1)   String.fromCharCode(65   stepCount[step])
})

console.log(steps) 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

Ответ №1:

Вы могли бы взять объект для отслеживания шага.

Для получения буквы вы могли бы использовать toString с основанием 36.

 let steps = [0, 0, 0, 1, 1, 2, 3, 4, 5, 5],
    stepCount = {};

steps = steps.map((step, i, a) => {
    if (step !== a[i - 1] amp;amp; step !== a[i   1]) return 'Step '   (step   1);
    stepCount[step] = stepCount[step] || 0;
    return 'Step '   (step   1)   (stepCount[step]     10).toString(36).toUpperCase();
});

console.log(steps); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

Ответ №2:

Используя Array.reduce , вы можете получить количество дублированных элементов и, основываясь на этих данных, можете получить следующий результат.

 let steps = [0, 0, 0, 1, 1, 2, 3, 4, 5, 5]
const groupBy = steps.reduce((acc, cur) => {
  acc[cur] ? acc[cur]    : acc[cur] = 1;
  return acc;
}, {});

const output = Object.entries(groupBy).flatMap(([ step, count ]) => {
  return count === 1 ? `Step ${ step   1}` : Array.from({length: count}, (_, i) => i).map((index) => `Step ${ step   1}${String.fromCharCode(65   index)}`);
});
console.log(output); 
 .as-console-wrapper { max-height: 100% !important; top: 0; }