Сортировка & lt; a & gt; внутри элемента списка по алфавиту [дубликат]

Извините, чтобы тратить время на все. Я нашел это решение здесь в Stack Overflow (просто взял некоторые изменения в моем поиске Google, чтобы найти)

import socket
request = b"GET / HTTP/1.1\nHost: www.cnn.com\n\n"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("cnn.com", 80))
s.send(request)
result = s.recv(10000)
while (len(result) > 0):
    print(result)
    result = s.recv(10000)

И все ответы были правильными, а также о завершении \r\n\r\n однако те возвратили статусы 301. Кажется, это решение как-то следует за перенаправлением? В любом случае, эти решения работали для меня

221
задан Shog9 15 October 2010 в 20:30
поделиться

9 ответов

Вы не нуждаетесь в jQuery для этого ...

function sortUnorderedList(ul, sortDescending) {
  if(typeof ul == "string")
    ul = document.getElementById(ul);

  // Idiot-proof, remove if you want
  if(!ul) {
    alert("The UL object is null!");
    return;
  }

  // Get the list items and setup an array for sorting
  var lis = ul.getElementsByTagName("LI");
  var vals = [];

  // Populate the array
  for(var i = 0, l = lis.length; i < l; i++)
    vals.push(lis[i].innerHTML);

  // Sort it
  vals.sort();

  // Sometimes you gotta DESC
  if(sortDescending)
    vals.reverse();

  // Change the list on the page
  for(var i = 0, l = lis.length; i < l; i++)
    lis[i].innerHTML = vals[i];
}

Прост в использовании ...

sortUnorderedList("ID_OF_LIST");

Live Demo & rarr;

101
ответ дан Josh Stodola 18 August 2018 в 18:58
поделиться
  • 1
    Одна из проблем, которые я обнаружил при таком подходе, заключается в том, что, поскольку только перемещение текста происходит, если вы связываете данные с узлами DOM с использованием jQuery.data перед сортировкой, эти ассоциации теперь указывают на неправильные узлы после сортировки. – Rudism 28 October 2011 в 14:57
  • 2
  • 3
    Buhuuu innerHTML! Не используйте это. Это проприетарный материал Microsoft и никогда не был признан W3C. – nottinhill 24 October 2012 в 13:28
  • 4
    ИМХО это ужасный ответ. Совершенно возможно переупорядочить узлы DOM без их сериализации и десериализации их снова и без уничтожения любых прикрепленных свойств и / или событий. – Alnitak 26 January 2013 в 00:45
  • 5
    ... но если бы вы использовали jQuery, как бы вы это сделали? – Matthew 26 October 2015 в 19:24

@ Ответ SolutionYogi работает как шарм, но кажется, что использование $ .each менее прямолинейно и эффективно, чем прямое добавление listitems:

var mylist = $('#list');
var listitems = mylist.children('li').get();

listitems.sort(function(a, b) {
   return $(a).text().toUpperCase().localeCompare($(b).text().toUpperCase());
})

mylist.empty().append(listitems);

Fiddle

6
ответ дан Buzut 18 August 2018 в 18:58
поделиться

Если вы используете jQuery, вы можете это сделать:

$(function() {

  var $list = $("#list");

  $list.children().detach().sort(function(a, b) {
    return $(a).text().localeCompare($(b).text());
  }).appendTo($list);

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<ul id="list">
  <li>delta</li>
  <li>cat</li>
  <li>alpha</li>
  <li>cat</li>
  <li>beta</li>
  <li>gamma</li>
  <li>gamma</li>
  <li>alpha</li>
  <li>cat</li>
  <li>delta</li>
  <li>bat</li>
  <li>cat</li>
</ul>

Обратите внимание, что возврат 1 и -1 (или 0 и 1) из функции сравнения абсолютно неверна .

23
ответ дан Community 18 August 2018 в 18:58
поделиться

Поместите список в массив, используйте JavaScript .sort(), который по умолчанию по алфавиту, затем преобразуйте массив обратно в список.

http://www.w3schools.com /jsref/jsref_sort.asp

0
ответ дан Elon Zito 18 August 2018 в 18:58
поделиться
84
ответ дан Jeetendra Chauhan 18 August 2018 в 18:58
поделиться

HTML

<ul id="list">
    <li>alpha</li>
    <li>gamma</li>
    <li>beta</li>
</ul>

JavaScript

function sort(ul) {
    var ul = document.getElementById(ul)
    var liArr = ul.children
    var arr = new Array()
    for (var i = 0; i < liArr.length; i++) {
        arr.push(liArr[i].textContent)
    }
    arr.sort()
    arr.forEach(function(content, index) {
        liArr[index].textContent = content
    })
}

sort("list")

JSFiddle Demo https://jsfiddle.net/97oo61nw/

] Здесь мы выталкиваем все значения элементов li внутри ul со специфическим id (который мы предоставили как аргумент функции) в массив arr и сортируем его с помощью метода sort () , который по умолчанию сортируется по алфавиту. После сортировки массива arr мы обрабатываем этот массив с помощью метода forEach () и просто заменяем текстовое содержимое всех элементов li на отсортированный контент

0
ответ дан Mikhail 18 August 2018 в 18:58
поделиться

Чтобы эта работа работала со всеми браузерами, включая Chrome, вам нужно сделать функцию обратного вызова sort () return -1,0 или 1.

см. http://inderpreetsingh.com / 2010/12/01 / chromes-javascript-sort-array-function-is-different-yet-proper /

function sortUL(selector) {
    $(selector).children("li").sort(function(a, b) {
        var upA = $(a).text().toUpperCase();
        var upB = $(b).text().toUpperCase();
        return (upA < upB) ? -1 : (upA > upB) ? 1 : 0;
    }).appendTo(selector);
}
sortUL("ul.mylist");
39
ответ дан PatrickHeck 18 August 2018 в 18:58
поделиться

Я искал, чтобы сделать это сам, и я не был удовлетворен ни одним из ответов, предоставленных просто потому, что, я считаю, они являются квадратичным временем, и мне нужно сделать это в списках сотен предметов долго.

Я закончил расширять jquery, и мое решение использует jQuery , но может быть легко изменено, чтобы использовать прямой javascript.

Я получаю доступ только к каждому элементу дважды и выполняю одно линейное вычисление , поэтому это должно, я думаю, работать намного быстрее на больших наборах данных, хотя я свободно признаюсь, что могу ошибаться там:

sortList: function() {
   if (!this.is("ul") || !this.length)
      return
   else {
      var getData = function(ul) {
         var lis     = ul.find('li'),
             liData  = {
               liTexts : []
            }; 

         for(var i = 0; i<lis.length; i++){
             var key              = $(lis[i]).text().trim().toLowerCase().replace(/\s/g, ""),
             attrs                = lis[i].attributes;
             liData[key]          = {},
             liData[key]['attrs'] = {},
             liData[key]['html']  = $(lis[i]).html();

             liData.liTexts.push(key);

             for (var j = 0; j < attrs.length; j++) {
                liData[key]['attrs'][attrs[j].nodeName] = attrs[j].nodeValue;
             }
          }

          return liData;
       },

       processData = function (obj){
          var sortedTexts = obj.liTexts.sort(),
              htmlStr     = '';

          for(var i = 0; i < sortedTexts.length; i++){
             var attrsStr   = '',
                 attributes = obj[sortedTexts[i]].attrs;

             for(attr in attributes){
                var str = attr + "=\'" + attributes[attr] + "\' ";
                attrsStr += str;
             }

             htmlStr += "<li "+ attrsStr + ">" + obj[sortedTexts[i]].html+"</li>";
          }

          return htmlStr;

       };

       this.html(processData(getData(this)));
    }
}
0
ответ дан Quirkles 18 August 2018 в 18:58
поделиться

Что-то вроде этого:

var mylist = $('#myUL');
var listitems = mylist.children('li').get();
listitems.sort(function(a, b) {
   return $(a).text().toUpperCase().localeCompare($(b).text().toUpperCase());
})
$.each(listitems, function(idx, itm) { mylist.append(itm); });

С этой страницы: http://www.onemoretake.com/2009/02/25/sorting-elements-with-jquery/

Выше кода сортирует ваш неупорядоченный список с id 'myUL'.

ИЛИ вы можете использовать такой плагин, как TinySort. https://github.com/Sjeiti/TinySort

313
ответ дан Saravana 18 August 2018 в 18:58
поделиться
  • 1
    Может ли последняя строка быть заменена на $ (listitems) .appendTo (mylist); ? – Amir 30 June 2010 в 07:00
  • 2
    H. L. Menken имеет цитату, которая описывает это решение: «Для каждой проблемы есть решение, которое является простым, изящным и неправильным». Этот процесс выполняется в O (n ^ 2) времени. Это не относится к относительно коротким спискам, но в списке, содержащем более 100 элементов, для завершения сортировки требуется 3-4 секунды. – Nathan Strong 29 December 2010 в 20:19
  • 3
    @Nathan: About & quot; Для каждой проблемы есть решение, которое является простым, элегантным и неправильным. & Quot; - Ну, неправильное решение не изящно. – Johann Philipp Strathausen 4 January 2011 в 12:01
  • 4
    Что-то может быть элегантным и интригующим, чтобы смотреть, но все равно терпеть неудачу. Элегантность не означает успеха. – Jane Panda 29 September 2011 в 15:55
  • 5
    Это решение не так. Он отвечает на вопрос. ОП не указал, что ему необходимо отсортировать список из более чем 100 предметов. Если его список никогда не будет длиннее 100 пунктов, это решение вполне приемлемо. +1, указав, что решение медленное, -1 для объявления решения, которое отвечает требованиям как «неправильное». – Samurai Soul 11 November 2014 в 16:27
Другие вопросы по тегам:

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