在javascript中重新排序节点列表

时间:2014-01-06 10:15:44

标签: javascript xml sorting

我想按VM字段名称属性对节点列表进行排序。 xml:

 <SRM>
  <HBR>
    <VM Name="mast0010">
      <FieldOne>ttttt</FieldOne>
      <Disk Name="Name One">
        <FieldTwo>aaaaa</FieldTwo>
        <FieldThree>bbbbb</FieldThree>
      </Disk>
      <Disk Name="Name Two">
        <FieldTwo>fffff</FieldTwo>
        <FieldThree>ccccc</FieldThree>
      </Disk>
    </VM>
    <VM Name="mast0003">
      <FieldOne>rrrrr</FieldOne>
      <Disk Name="Name One">
        <FieldTwo>ddddd</FieldTwo>
        <FieldThree>eeeee</FieldThree>
      </Disk>
    </VM>
  </HBR>
</SRM>

我写了下面的代码:

var x=xmlDoc.getElementsByTagName("VM");        
var ax = Array.prototype.slice.call(x, 0);

for (var i=0; i<ax.length; i++) {
ax.sort(function(a, b){
    var a = ax[i].getAttribute('Name');
    var b = ax[i].getAttribute('Name');
    if(a < b) return -1;
    if(a > b) return 1;
    return 0;
    });
}

for (i=0; i<ax.length; i++) {
    document.write(ax[i].getAttribute('Name') + "<br/>");
}

返回mast0010,mast0003 我需要mast0003,mast0010订单。请帮帮我。我不知道问题出在哪里。 THX

2 个答案:

答案 0 :(得分:1)

不要使用document.write,它来自古老版本的JavaScript,并不打算再使用了。如果要将节点添加到活动文档中,请使用parent.appendChild(node)parent.insertBefore(node)

你也在调用ax.sort一百万次(或者更确切地说,对阵列中的每个元素都调用一次)。这不是你如何使用sort,所以只需将其转换为单行,并依赖于排序输入,不要触及你的数组。

重写代码:

ax = ax.sort(function(a,b) {
  a = a.getAttribute("Name");
  b = b.getAttribute("Name");
  return a < b ? -1 : b < a ? 1 : 0; });
});

然后以正确的方式将生成的元素插入到文档中。

ax.forEach(function(node) {
  document.body.appendChild(node);
});

答案 1 :(得分:-1)

Check this working demo

这是为您修复的排序功能。

var x=xmlDoc.getElementsByTagName("HBR")[0].getElementsByTagName("VM");        
var ax = Array.prototype.slice.call(x, 0);

for (var i=0; i<ax.length; i++) {
ax.sort(function(a, b){
    a = a.getAttribute('Name');
    b = b.getAttribute('Name');

    if(a < b) return -1;
    if(a > b) return 1;
    return 0;
    });
}