2011-01-21 162 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