Как отсортировать элементы внутри с помощью JavaScript (пузырьковая сортировка)?

#javascript #html

#javascript #HTML

Вопрос:

У меня есть 3

  • элементы внутри :

     <ul id = "friends">
                
        <li>Zvonar</li>
        <li>Ivan</li>
        <li>Petro</li>
    
    </ul>
      

    И JS-код:

     let list = document.getElementsByTagName('li');
    
                    
    for (let i = 0; i < list.length; i  ) {
    
        for (let j = 0; j < list.length; j  ) {
    
            if (list[j].textContent > list[j   1].textContent) {
    
                buf = list[j].textContent;
                list[j] = list[j   1].textContent;
                list[j   1] = buf;
            }
        }
    }
      

    Но это выдает мне ошибку, что [j 1] не определено в четвертой строке.

    Есть ли какой-нибудь способ отсортировать их с помощью JavaScipt? Буду благодарен за любой ответ.

  • Комментарии:

    1. Используйте let i = 0; i < list.length - 1; i и let j = i 1; j < list.length; j . Теперь сравните (и, возможно, поменяйте местами) [i] и [j] . (В JS тоже есть Array.sort )

    Ответ №1:

    Вы ссылаетесь на индекс массива, который не существует. Список начинается с индекса 0-2, поэтому на последней итерации оператор if прервется, потому что вы выполняете 2 1 = list[3] . Но у массива нет этого индекса. Поскольку это последний индекс массива, и этот индекс уже был сверен с индексом n-1, нет причин проверять его. Итак, я думаю, вы можете изменить свой цикл на:

     for (let j = 0; j < list.length-1; j  ) {...
      

    Я не тестировал это, но я думаю, что это решит вашу проблему

    Ответ №2:

    Когда вы находитесь на последнем индексе, вы добавляете один, чтобы получить следующий, и там ничего нет.

    Лично я бы не стал менять местами текст. Я бы передал массив элементов.

     const bubbleSortText = function(arr) {
      const len = arr.length;
      for (let i = 0; i < len; i  ) {
        for (let j = 0; j < len - 1; j  ) {
          if (arr[j].innerText.localeCompare(arr[j   1].innerText) === 1) {
            const tmp = arr[j];
            arr[j] = arr[j   1];
            arr[j   1] = tmp;
          }
        }
      }
      return arr;
    };
    
    const ul = document.querySelector('#friends');
    const lis = Array.from(document.querySelectorAll('#friends li'));
    const newOrder = bubbleSortText(lis);
    newOrder.forEach(function (li) {
      ul.appendChild(li);
    });  
     <ul id="friends">
      <li>Zvonar</li>
      <li>Ivan</li>
      <li>Petro</li>
    </ul>  

    Ответ №3:

     let list = document.getElementsByTagName('li');
    let arr = Array.from(list);
    arr.sort((a, b) => a.innerText > b.innerText ? 1 : a.innerText < b.innerText ? -1 : 0)
      

    Комментарии:

    1. Я не голосовал за понижение, но возможной мотивацией понижающего голоса было: это решение отсортирует список, но не изменит порядок элементов в DOM (или их содержимого) и, конечно, не изменит отображение HTML 😉