0

作为上一个问题的后续,使用 jquery 使用 regex 在 .attr() 上查找 .each

我想在通过 .each() 运行属性之前按字母顺序对属性进行排序。最终输出是按属性顺序添加子 div。

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

当我通过下面的代码解析它时,它输出值b,c,a,我需要先对元素进行排序,extra1, extra5, extra9, more, stuff然后通过 .each()+regex 运行它,这样值就出来了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提前艺术

4

1 回答 1

2

根据这个 MDN 文档,属性集合是一个映射,而不是一个数组,因此它没有定义的顺序。如果你想让它排序,你首先必须把它放在数组中,排序,然后.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(""));

如果您的属性可以按字典顺序排序并且您不超出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);
}
于 2012-07-07T06:10:29.647 回答