@ppskmg

Как разложить js массив состоящий из ID на индексы, индексы засунуть в input в блок относящийся к ID?

Есть страница где создаются отдельные блоки, каждый блок является постом с уникальным ID + подключена библиотека SortableJS чтобы посты можно было сортировать drag and drop.
На выходе получаю массив с порядком блоков такого вида
var sort_position = '122|124|132|133|131|98|100|102|103|104|105|106|108|107'; // массив
var sort_id = sort_position.split('|'); //формат массива (122,124,...)


Чтобы сохранить значение в базу мне нужно выдернуть каждый ID присвоить ему порядковый номер который задан в массиве и засунуть индекс в input в конкретном посте и дальше отдать ajax
структура html примерно такая
  • Длина массива не известна
  • data-id так же не известны
<input id="sort_position"> // в этот инпут выгружаю массив для наглядности изменений
<ul>
     <li data-id="122"> <input class="sort_index"></li>
     <li data-id="124"><input class="sort_index"></li>
     <li data-id="132"><input class="sort_index"></li>
</ul>


Сложность именно в написании вложенных циклов который пройдётся по массиву соберёт индексы, следующим циклом переберёт элементы <li data-id="132"> сопоставит с результатом первого цикла if 132=132 и запишет в инпут index у которого родитель с id 132 .

А если содержимое измениться, то цикл повториться вновь и перезапишет все индексы.

Возможно есть проще решение но именно с текущим array у меня нет проблем с обновлением значений при перетаскивании блоков.

если просто получать значение индекса через elem.index(), то сложность с обновлением этого индекса при перетаскивании.

3 дня вожусь с этим.
...
  • Вопрос задан
  • 269 просмотров
Решения вопроса 2
dollar
@dollar
Делай добро и бросай его в воду.
Сложность именно в написании вложенных циклов который пройдётся по массиву соберёт индексы, следующим циклом переберёт элементы сопоставит с результатом первого цикла if 132=132 и запишет в инпут index у которого родитель с id 132

Думаю, всё решается в два этапа.

Первый этап - массив с индексами превращаем в объект с ключами. Ведь каждый раз искать элемент в массиве не красиво. А поиск по ключу (или хешу) - наше всё. Ну, можно ещё массив с индексами сделать, но это дело вкуса.
var obj = {};
sort_id.forEach(id=>{
  obj[id] = true;
});


Второй этап - перебираем все li и проверяем условия. Применяем какой-нибудь селектор - и дело в шляпе.
var arr = document.querySelectorAll('li[data-id]');
arr.forEach(li=>{
  let id = li.dataset.id;
  if (obj[id]) { //Нашли id в массиве sort_id
    //Что-то делаем. У нас есть всё: id и соответствующий li. Что ещё надо?
  }
});

3 дня вожусь с этим.

Ответ написан за 10 минут. :)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы