2011-01-21 163 views
6

我有我认为应该是一个直截了当的问题;让我来解释一下快:如何在JavaScript中重新排序/排序NodeList?

在我的JavaScript,food.xml与阅读:

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

让我现在有一个节点列表xmlFoodList与所有的食物元素。太好了。问题是我想根据里面的元素<category>排序节点。我可以阅读了:

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

后来在我的代码,食品项目显示在列表,如你所期望的,我想同一类的食物一起列出。所以,我的问题是:如何根据其类别对xmlFoodList中的节点进行重新排序?

注:我不能改变food.xml进来,我不希望我的编辑后的代码来进行排序作为填充列表。我不想将NodeList转换为数组,因为我必须重写很多后面的代码。性能实际上并不是什么大问题,所以您可以随意克隆/嵌套循环。谢谢你的时间。

回答

0

看一看:Xml, xsl Javascript sorting。最糟糕的情况是,您将数据转换为完全相同的xml,但排序。只要您支付转换罚款,您可以考虑将其转换为更适用于下一步的任何形式。

1

这是一个好主意,使用Javascript库获得现成的功能w.r.t节点列表操作,如重新排序,排序,foreach等我推荐YUI-3,请参阅YUI-3 NodeList

+0

没有太多关于排序 – lisak 2011-04-15 17:38:11

11

您可以订购节点列表中的元素,如果将其转换为一个数组第一:

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模式 - 例如,如果您的食物属于多个类别,则只能按照上述代码中的第一类进行排序。

+0

我知道这是旧的,但它非常帮助我解决我遇到的问题。由于我没有将我的节点列表转换为数组,因此未在Chrome中正确排序。我有一个非常接近你的排序功能,一旦我转换它,它的工作!非常感谢你! – illinoistim 2013-05-03 18:31:03