#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; }