我认为应该是一个直截了当的问题;让我快速解释一下:
在我的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转换为数组,因为我不得不重写很多以后的代码。性能实际上并不是一个问题,因此您可以随心所欲地克隆/嵌套循环。谢谢你的时间。
答案 0 :(得分:12)
如果首先将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架构 - 例如,如果您的食物属于多个类别,则只能按照上述代码中的第一类进行排序。
答案 1 :(得分:1)
使用Javascript库来获取节点列表操作(如重新排序,排序,foreach等)的现成函数是个好主意。我建议使用YUI-3,请参考YUI-3 NodeList。
答案 2 :(得分:0)
看看这个:Xml, xsl Javascript sorting。最糟糕的情况是,您将数据转换为完全相同的xml,但已排序。只要您支付转换代价,您可以考虑将其转换为对下一步更有用的形式。