Задать вопрос
@mig38

Как отсортировать по иерархическим папкам\таблицам 1М файлов в названии которых есть ФИО?

Есть 1М файлов (пусть в формате .md или .json), название которых состоит из Фамилии Имени Отчества. (Арзамасцев Арбрам Агдамович, Богуславский Борис Бедросович, Вавилов Василий Владиславович) Нужно сделать сортировку (для генерации страниц или положить в таблицу). получится 30 папок с фамилиями, а каждой из которых 30 папок с Именем, в каждой 30 папок с отчеством, где лежат файлы.

Можно средствами браузера, результатам будет список из 30 фамилий
, в котором 30 имён в каждом из которых 30 отчеств, со списком доступных файлов.

В голову пришло сортировать сначала по алфавиту, затем методом shif() на одну позицию до пробела\слеша-тире. т.е. знака препинания, потом повторить, если ничего не осталось то снова по алфавиту прогнать.

у кого какие мысли ещё есть? можно подключить SQL\NoSQL БД...

для затравки, сортинг в браузере, но только по алфавиту


<!DOCTYPE html>
<html>
<title>Sort a HTML List Alphabetically</title>
<body>

<p>Click the button to sort the list ascending (A to Z):</p>
<p>Click again to sort the list descending (Z to A):</p>

<button onclick="sortListDir()">Sort</button>

<ul id="id01">
  <li>Абрамов Абрам Абрамович</li>
  <li>Абыров Геремей</li>
  <li>Быстров Абрам Абрамович</li>
  <li>Быстров Абрам Венедиктович</li>
  <li>Абрам Венедиктович</li>
  <li>Васильев Василий  Абрамович</li>
  <li>Васильев-Василий -Геннадьевич</li>
</ul>

<script>
function sortListDir() {
  var list, i, switching, b, shouldSwitch, dir, switchcount = 0;
  list = document.getElementById("id01");
  switching = true;
  //Set the sorting direction to ascending:
  dir = "asc"; 
  //Make a loop that will continue until no switching has been done:
  while (switching) {
    //start by saying: no switching is done:
    switching = false;
    b = list.getElementsByTagName("LI");
    //Loop through all list-items:
    for (i = 0; i < (b.length - 1); i++) {
      //start by saying there should be no switching:
      shouldSwitch = false;
      /*check if the next item should switch place with the current item,
      based on the sorting direction (asc or desc):*/
      if (dir == "asc") {
        if (b[i].innerHTML.toLowerCase() > b[i + 1].innerHTML.toLowerCase()) {
          /*if next item is alphabetically lower than current item,
          mark as a switch and break the loop:*/
          shouldSwitch = true;
          break;
        }
      } else if (dir == "desc") {
        if (b[i].innerHTML.toLowerCase() < b[i + 1].innerHTML.toLowerCase()) {
          /*if next item is alphabetically higher than current item,
          mark as a switch and break the loop:*/
          shouldSwitch= true;
          break;
        }
      }
    }
    if (shouldSwitch) {
      /*If a switch has been marked, make the switch
      and mark that a switch has been done:*/
      b[i].parentNode.insertBefore(b[i + 1], b[i]);
      switching = true;
      //Each time a switch is done, increase switchcount by 1:
      switchcount ++;
    } else {
      /*If no switching has been done AND the direction is "asc",
      set the direction to "desc" and run the while loop again.*/
      if (switchcount == 0 && dir == "asc") {
        dir = "desc";
        switching = true;
      }
    }
  }
}
</script>
</body>
</html>
  • Вопрос задан
  • 146 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Aricus
В цикле берём название файла, отбрасываем то, что после точки и разбиваем по пробелу (по тире не надо: фамилии через тире могут быть). Далее записываем в массив в таком виде:
nameFiles['Арзамасцев']['Арбрам']['Агдамович'][0] = 'Арзамасцев Арбрам Агдамович.pdf'

[0] - на случай полных тезок. Перед отображением на каждой итерации сортируем массив по ключу.
Это всё надо делать не на странице после отображения, а на сервере. В подключении базы данных смысла не вижу, если кроме названия файлов не надо приписать ещё каких данных. Достаточно сканировать содержимое папки при загрузке страницы.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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