Переделать строку из javascript

Есть строка, которая показывает время до совершения чуда. Она выглядит следующем образом - "AdBhCmDs", где A, B, C, D - числа, показывающие время. Мне надо переделать её в "A дней, B часов, C минут и D секунд". Если присутствуют только секунды и минуты, то надо оставить только их, и с другими комбинациями так же.

Я ещё ничего не пробовала, так как совсем в этом не разбираюсь.

Немного кода:

var timeleft = '%cbp_ban_player_timeleft%'

function timeleftget() {
    if (timeleft == '') {
        return ''
    }
}

timeleft()

Что писать между ' я не знаю


Ответы (1 шт):

Автор решения: UModeL

За основу взята функция из этого ответа. Дальнейшее ещё проще:

  • Создаём объект с нужными массивами склонений;
  • Ищем в исходной строке числа с единицами измерения и перебираем массив найденных совпадений;
  • Передаём полученные индексы и ключи в функцию для выбора склонения.

let out = document.querySelector('.out');

let aDeclination = {
  d: ['день', 'дня', 'дней'],
  h: ['час', 'часа', 'часов'],
  m: ['минута', 'минуты', 'минут'],
  s: ['секунда', 'секунды', 'секунд']
};
function fDeclination(int, arr) {
  return arr[int % 100 > 4 && int % 100 < 20 ? 2 : [2, 0, 1, 1, 1, 2][int % 10 < 5 ? int % 10 : 5]];
}

function timeleftget(sTime) {
  let aTime = sTime.match(/(\d+\w)/g);
  for (let i = 0; i < aTime.length; i++) {
    out.insertAdjacentHTML('beforeend', `<div><span>${aTime[i].replace(/\D/g, '')}</span><span>${fDeclination(+aTime[i].replace(/\D/g, ''), aDeclination[aTime[i].replace(/\d/g, '')])}</span></div>`);
  }
}

timeleftget('27d17h9m31s');
.out { display: flex; justify-content: center; gap: 1em; }
.out > div { display: flex; flex-direction: column; align-items: center; }
.out span:first-child { font: bold 28px/1em sans-serif; }
<div class="out"></div>

→ Ссылка