2012-07-07 30 views
0

为按照从先前的问题using jquery to find .each on .attr() with regex前一个HTML对象的属性排序,的jQuery或JavaScript来正则表达式

我想属性通过。每个运行之前按字母顺序排序()。最终的输出是按照属性的顺序添加子div。

<div id="myElement" extra1="a" stuff="z" extra9="c" more="y" extra5="b" /div> 

当我解析它通过下面的代码,它输出值b,c,a,我需要的是这样的值出来作为对元件第一分类到顺序extra1, extra5, extra9, more, stuff然后通过。每个()+正则表达式运行它a,b,c

var el = $('#myElement'); 
var attributes = el[0].attributes; 

$.each(attributes,function(i,attr){ 
var name = attr.nodeName; 
var val = attr.nodeValue; 
var regex = /^extra\d$/; 

    if(name.match(regex)) { 
    $(parentDiv).append("<div id="+val+" /div>"); 
    } 
});​ 

Thx提前艺术

回答

2

this MDN doc,属性集合是一个映射,而不是阵列所以它不具有确定的顺序。如果你想对它进行排序,你首先必须把它放在数组中,然后排序,然后在排序的数组上执行.each()

或者,您可以将.each()中的结果收集到一个数组中,对结果进行排序,然后按照期望的顺序在最后附加排序结果。看你的代码,我认为这是较少的工作,所以你能做到这一点是这样的:

var el = $('#myElement'); 
var attributes = el[0].attributes; 
var output = []; 

$.each(attributes,function(i,attr){ 
    var name = attr.nodeName; 
    var val = attr.nodeValue; 
    var regex = /^extra\d$/; 

    if(name.match(regex)) { 
     output.push("<div id="+val+" /div>"); 
    } 
});​ 
$(parentDiv).append(output.sort().join("")); 

这个简单的排序工作,如果你的属性可以分为lexigraphic秩序和你不超越extra9。如果它超出了单个数字号码,那么您将不得不将数字转换为数字,并使用自定义分类功能来生成正确的排序顺序,如下所示:

var el = $('#myElement'); 
var attributes = el[0].attributes; 
var output = []; 
var regex = /^extra(\d+)$/; 

$.each(attributes,function(i,attr){ 
    var name = attr.nodeName; 
    var val = attr.nodeValue; 
    var matches, item; 

    if(matches = name.match(regex)) { 
     item = {}; 
     item.html = "<div id="+val+" /div>"; 
     item.num = parseInt(matches[1], 10); 
     output.push(item); 
    } 
});​ 
// sort array of objects with a custom sort function 
output.sort(function(a, b) { 
    return(a.num - b.num); 
}); 
// append data in correct order now that the items are sorted 
for (var i = 0; i < output.length; i++) { 
    $(parentDiv).append(output[i].html); 
}