@ishmahorka

Как распределить li по разным ul в зависимости от их первой буквы?

Как распределить li по разным ul в зависимости от их первой буквы, а родителям задать соответствующие буквенные классы?
Например есть:
<ul class="ul-parent">
  <li>Acer</li>
  <li>Samsung</li>
  <li>Sony</li>
  <li>Huawei</li>
  <li>HTC</li>
  <li>Xiaomi</li>
</ul>

Как сделать с помощью JS, чтобы это форматировалось как:
<ul class="ul-parent a-litter">
      <li>Acer</li>
    </ul>
    <ul class="ul-parent s-litter">
      <li>Samsung</li>
      <li>Sony</li>
    </ul>
    <ul class="ul-parent h-litter">
      <li>Huawei</li>
      <li>HTC</li>
    </ul>
    <ul class="ul-parent x-litter">
      <li>Xiaomi</li>
    </ul>
  • Вопрос задан
  • 166 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
const ul = document.querySelector('.ul-parent');

const groupedNodes = Array.prototype.reduce.call(
  ul.children,
  (acc, n) => {
    const k = n.textContent[0].toLowerCase();
    (acc[k] = acc[k] ?? []).push(n);
    return acc;
  },
  {}
);

ul.replaceWith(...Object.entries(groupedNodes).map(n => {
  const ul = document.createElement('ul');
  ul.classList.add('ul-parent', n[0] + '-litter');
  ul.append(...n[1]);
  return ul;
}));

или

const ul = document.querySelector('.ul-parent');

const groupedHTML = Array
  .from(ul.querySelectorAll(':scope > li'))
  .reduce((acc, { innerText: [ c ], outerHTML }) => {
    const k = c.toLowerCase();
    (acc[k] = acc[k] ?? []).push(outerHTML);
    return acc;
  }, {});

ul.outerHTML = Object
  .entries(groupedHTML)
  .map(([ k, v ]) => `<ul class="ul-parent ${k}-litter">${v.join('')}</ul>`)
  .join('');
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
27 нояб. 2024, в 19:08
1500 руб./в час
27 нояб. 2024, в 18:19
2000 руб./за проект
27 нояб. 2024, в 17:41
2000 руб./за проект