繁体   English   中英

如何在JavaScript中重新排序/排序NodeList?

[英]How can I reorder/sort a NodeList in JavaScript?

我认为应该是一个直截了当的问题; 让我快速解释一下:

在我的JavaScript中, food.xml被读入:

getMenuXml.open("GET","food.xml",false);
getMenuXml.send();
xmlDoc=getMenuXml.responseXML;
xmlFoodList = xmlDoc.getElementsByTagName("food");

所以现在我有一个带有所有食物元素的NodeList xmlFoodList 到目前为止很棒。 问题是我想根据里面的元素<category>对节点进行排序。 我可以读到:

xmlFoodList[i].getElementsByTagName("category")[0].childNodes[0].nodeValue

稍后在我的代码中,食物项目显示在列表中,正如您所期望的那样,我希望将同一类别的食物列在一起。 所以,我的问题是: 如何根据类别对xmlFoodList的节点进行重新排序?

注意:我无法更改food.xml ,我不想编辑后面的代码来进行排序,因为列表已填充。 我不想将NodeList转换为数组,因为我不得不重写很多以后的代码。 性能实际上并不是一个问题,因此您可以随心所欲地克隆/嵌套循环。 谢谢你的时间。

如果先将它们转换为数组,则可以对NodeList的元素进行排序:

var foods = xmlDoc.getElementsByTagName("food");
var foodsArray = Array.prototype.slice.call(foods, 0);

然后你可以使用sort方法:

foodsArray.sort(function(a,b) {
    var aCat = a.getElementsByTagName("category")[0].childNodes[0].nodeValue;
    var bCat = b.getElementsByTagName("category")[0].childNodes[0].nodeValue;
    if (aCat > bCat) return 1;
    if (aCat < bCat) return -1;
    return 0;
});

这在很大程度上取决于您的XML架构 - 例如,如果您的食物属于多个类别,那么它们只能按照上面代码中的第一个类别进行排序。

使用Javascript库来获取节点列表操作的现成函数是个好主意,例如重新排序,排序,foreach等。我建议使用YUI-3,请参考YUI-3 NodeList

看看这个: Xml,xsl Javascript排序 最糟糕的情况是,您将数据转换为完全相同的xml,但已排序。 只要您支付转换惩罚,您可以考虑将其转换为对下一步更有用的形式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM