@ishimskayamahorka14

Как задать элементам ID с условием первого не повторяющегося далее символа?

Имеются несколько заголовков, у которых первые символы - числа. Числа могут повторяться несколько раз в качестве первых символов в каждом новом заголовке. Как сделать, чтобы ID задавался только тем заголовкам, у которых число 1, 2, 3 и.т.д встречается впервые? Например, чтобы из:

<h2>1 сезон, 1 серия</h2>
<h2>1 сезон, 2 серия</h2>
<h2>2 сезон, 1 серия</h2>
<h2>2 сезон, 2 серия</h2>


Получалось:
<h2 id="sezon-1">1 сезон, 1 серия</h2>
<h2>1 сезон, 2 серия</h2>
<h2 id="sezon-2">2 сезон, 1 серия</h2>
<h2>2 сезон, 2 серия</h2>
  • Вопрос задан
  • 127 просмотров
Решения вопроса 2
Tim-A-2020
@Tim-A-2020
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
Такие варианты есть:

document.querySelectorAll('h2').forEach(n => {
  const [ season, , episode ] = n.innerText.split(' ');
  if (+episode === 1) {
    n.id = `season-${season}`;
  }
});

[...document.querySelectorAll('h2')]
  .filter(n => n.innerText.endsWith(', 1 серия'))
  .forEach((n, i) => n.id = `season-${i + 1}`);

document.querySelectorAll('h2').forEach((n, i, a) => {
  const prev = i && a[i - 1].innerText.match(/\d+/)[0];
  const curr = n.innerText.match(/\d+/)[0];
  if (curr !== prev) {
    n.id = `season-${curr}`;
  }
});

Array
  .from(document.querySelectorAll('h2'))
  .reduce((acc, n) => (acc[parseInt(n.innerText)] ??= n, acc), [])
  .forEach((n, i) => n.id = `season-${i}`);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы