Показать сообщение отдельно
  #35 (permalink)  
Старый 07.01.2011, 07:55
Аспирант
Отправить личное сообщение для JSTalker Посмотреть профиль Найти все сообщения от JSTalker
 
Регистрация: 29.06.2009
Сообщений: 92

Цитата:
Пример15.5. Сортировка элементов в алфавитном порядке
<script>
function sortkids(e) {
    // Это элемент, потомки которого должны быть отсортированы
    if (typeof e == "string") e = document.getElementById(e);
    // Скопировать дочерние элементы (не текстовые узлы) в массив
    var kids = [];
    for(var x = e.firstChild; x != null; x = x.nextSibling)
        if (x.nodeType == 1 /* Node.ELEMENT_NODE */) kids.push(x);
    // Выполнить сортировку массива на основе текстового содержимого
    // каждого дочернего элемента. Здесь предполагается, что каждый
    // потомок имеет единственный вложенный элемент – узел Text 
    kids.sort(function(n, m) {     // Функция сравнения для сортировки
        var s = n.firstChild.data; // Текстовое содержимое узла n
        var t = m.firstChild.data; // Текстовое содержимое узла m
        if (s < t) return  1;      // Узел n должен быть выше узла m
        else if (s > t) return 1;  // Узел n должен быть ниже узла m
        else return 0;             // Узлы n и m эквивалентны
    });
    
    // Теперь нужно перенести узлыыпотомки обратно в родительский элемент
    // в отсортированном порядке. Когда в документ вставляется уже 
    // существующий элемент, он автоматически удаляется из текущей позиции,
    // в результате операция добавления этих копий элементов автоматически
    // перемещает их из старой позиции. Примечательно, что все текстовые узлы, 
    // которые были пропущены, останутся на месте.
    for(var i = 0; i < kids.length; i++) e.appendChild(kids[i]);
}
</script>
<ul id="list"> <!—Этот список будет отсортирован   >
<li>один<li>два<li>три<li>четыре<li>пять 
<!!! элементы не в алфавитном порядке   >
</ul>
<!!! кнопка, щелчок на которой запускает сортировку списка   >
<button onclick="sortkids('list')">Сортировать</button>
просьба прокомментировать:
1. Ситуацию с циклом for: видимо есть какой то шаблон (каркас), на котором можно реализовывать различные варианты циклов for: ( in )? (firstChild, !=null, nextSibling). В частности как работает вариант с firstChild, nextSibling?
2. Все таки ситуацию с sort()-ом, не понять:
2.1 Сравнивающая функция может иметь только 2 аргумента?
2.2 Эти m и n ни что иное как l и r в QuickSort?
Как вообще лучше читать такие сорты?
А то у меня мозг перегревается их анализировать

Последний раз редактировалось JSTalker, 07.01.2011 в 08:01.
Ответить с цитированием