如何按element.name对javascript对象数组进行排序

时间:2009-09-14 22:21:06

标签: javascript arrays dom sorting prototypejs

我尝试使用javascript和prototype编写一些验证脚本。

我想要做的是遍历表单的所有元素并验证每个答案。我的代码有效,但DOM元素数组未排序。我想按ID分类。

这是我的代码,如果我注释掉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);

}

我想知道问题可能是某些元素没有名称。任何人都有另一种更简单的方法来排序.name?

的DOM元素数组

3 个答案:

答案 0 :(得分:3)

这应该这样做:

$$('#myForm *[name]').sortBy(function(el){ return el.name; });

答案 1 :(得分:1)

这是因为sort()不是您使用DomElementList检索的.elements的方法。

好消息是,您可以使用Javascript技巧将Array.sort方法应用于DomElementList

然后,你只需要在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]);
}

答案 2 :(得分:1)

在没有 if 的情况下基于原生js sort函数实现。

elements.sort(function(a, b) { return 2 * (a.name > b.name) - 1; })