Как отсортировать массив объектов javascript по element.name

Я пытаюсь написать сценарий проверки, используя javascript и прототип.

Что я хочу сделать, так это перебрать все элементы формы и проверить каждый ответ. Мой код работает, НО массив элементов DOM не отсортирован. Я хотел бы отсортировать элементы по их идентификатору.

Вот мой код, который отлично работает, если я закомментирую elem.sort(zelementsort);

function zelementsort(a,b) {
    if (a.name > b.name)
        return -1;
    else if (b.name > a.name)
        return 1;
    else 
        return 0;
}   

var elem = document.getElementById('myform').elements;
elem.sort(zelementsort);

for(var i = 0; i < elem.length; i++)
{
     alert("Name = " + elem[i].name);

}

Интересно, может ли проблема заключаться в том, что у некоторых элементов нет имен. У кого-нибудь есть другой более простой способ сортировки массива элементов DOM по их .name?


person jeph perro    schedule 14.09.2009    source источник


Ответы (3)


Это должно сделать это:

$$('#myForm *[name]').sortBy(function(el){ return el.name; });
person kangax    schedule 14.09.2009
comment
Спасибо, это сработало отлично var elem = $$('#myForm *[name]').sortBy(function(el){ return el.name; }); - person jeph perro; 16.09.2009

Это связано с тем, что sort() не является методом DomElementList, который вы извлекаете с помощью .elements.

Приятно то, что вы можете применить метод Array.sort к вашему DomElementList, используя трюк Javascript.

Затем вам просто нужно снова добавить узлы в DOM, они не будут дублироваться, а будут перемещены.

var myform = document.getElementById('myform'),
    elem = myform.elements;

// call the Array.sort() method on our DomElementList
Array.prototype.sort.call(elem, function()
{
    if (a.name > b.name)
        return -1;
    else if (b.name > a.name)
        return 1;
    else 
        return 0;
});

for(var i = 0; i < elem.length; i++)
{
     myform.appendChild(elem[i]);
}
person Vincent Robert    schedule 06.11.2009

Реализация без if на основе встроенной js-функции sort.

elements.sort(function(a, b) { return 2 * (a.name > b.name) - 1; })
person user854301    schedule 28.10.2013
comment
Отлично, это сработало очень хорошо! Спасибо за решение! По убыванию: elements.sort(function(a, b) { return 2 * (a.name < b.name) - 1; }) - person Thoa Asgart; 05.05.2015