12

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

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

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

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

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

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

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

4

3 回答 3

16

如果先将它们转换为数组,则可以对 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 模式 - 例如,如果您的食物属于多个类别,则它们只会按上面代码中的第一个类别进行排序。

于 2011-01-21T16:31:01.637 回答
1

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

于 2011-01-21T15:09:03.733 回答
0

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

于 2011-01-21T14:49:06.357 回答