簡體   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