我想按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
答案 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)
这是为您修复的排序功能。
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;
});
}