Динамическое добавление optgroup по символам

249
04 мая 2018, 09:41

Мне нужно сделать так, чтоб тэг optgroup динамически оборачивал тэги option, а значением его был первый символ текста в option. То есть должна получиться такая разметка. Как это сделать в JS?

<select id="select">
    <optgroup label="A">
        <option value="1">Andromed</option>
        <option value="2">AnkosiManila</option>
    <optgroup>
    <optgroup label="B">
        <option value="3">Backend</option>
        <option value="4">Bravisiimo</option>
    </optgroup>
    <optgroup label="C">
        <option value="5">Cokolada</option>
        <option value="6">Cerny</option>
    </optgroup>
    <optgroup label="M">
        <option value="7">Mapping</option>
        <option value="8">Marroni</option>
    </optgroup>
    <optgroup label="N">
        <option value="9">NugetPack</option>
    </optgroup>
    <optgroup label="J">
        <option value="10">Jaguar</option>
    </optgroup>
</select>

Благодарю

Answer 1

function group(select) { 
  const oldGroups = select.querySelectorAll('optgroup'); 
   
  for (const group of oldGroups) { 
    const options = group.querySelectorAll('option'); 
    select.appendChild(select); 
    select.removeChild(group); 
  } 
   
  const options = select.querySelectorAll('option'); 
   
  const groups = {}; 
  for (const option of options) { 
    const firstLetter = option.innerText[0]; 
    if (firstLetter) { 
      if (!groups.hasOwnProperty(firstLetter)) { 
        groups[firstLetter] = []; 
      } 
      groups[firstLetter].push(option); 
    } 
  } 
   
  for (const letter of Object.keys(groups)) { 
    const group = document.createElement('optgroup'); 
    group.label = letter; 
    select.appendChild(group); 
 
    for (const option of groups[letter]) { 
      group.appendChild(option); 
    } 
  } 
} 
 
const $select = document.querySelector('#select'); 
group($select);
<select id="select"> 
        <option value="1">Andromed</option> 
        <option value="2">AnkosiManila</option> 
        <option value="3">Backend</option> 
        <option value="4">Bravisiimo</option> 
        <option value="5">Cokolada</option> 
        <option value="6">Cerny</option> 
        <option value="7">Mapping</option> 
        <option value="8">Marroni</option> 
        <option value="9">NugetPack</option> 
        <option value="10">Jaguar</option> 
</select>

READ ALSO
Работа со скроллом

Работа со скроллом

Есть страница у которой сразу отображен скроллНа странице при нажатии на кнопку появляется pop-up у которого тоже есть скролл

226
Некорректная работа browserSync

Некорректная работа browserSync

Во время верстки для авторелоада страницы использую browser-syncНеисправность состоит в том, что при вызове browser-sync через командную строку browser-sync...

218
Каким методом сделать анимацию?

Каким методом сделать анимацию?

http://yapxru/v/BTaYd Как сделать данную задачу с помощью jquery ? Или, Какой метод использовать ??

254