2011-01-21 11 views
6

Mam to, co moim zdaniem powinno być prostym pytaniem; pozwól mi szybko wyjaśnić:Jak mogę zmienić kolejność/sortować NodeList w JavaScript?

W moim JavaScript, food.xml jest odczytywany z:

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

tak, że teraz mam NodeList xmlFoodList ze wszystkimi elementami spożywczych. Świetne do tej pory. Problem polega na tym, że chcę posortować węzły na podstawie elementu <category> w środku. Czytam, że z:

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

Później w kodzie, że produkty żywnościowe są wyświetlane na liście, a jak można się spodziewać, chcę jedzenie z tej samej kategorii powinny być wymienione razem. Moje pytanie brzmi: Jak mogę zmienić kolejność węzłów w xmlFoodList na podstawie ich kategorii?

Uwagi: Nie można zmienić food.xml wchodzącej i nie chcę edytować mojego późniejszego kodu, aby przeprowadzić sortowanie w miarę zapełniania listy. Nie chcę konwertować NodeList do tablicy, ponieważ musiałbym przepisać dużo późniejszego kodu. Wydajność nie jest tak naprawdę niepokojąca, więc możesz swobodnie klonować/zagnieżdżać pętlę, ile tylko chcesz. Dziękuję za Twój czas.

Odpowiedz

0

Spójrz na to: Xml, xsl Javascript sorting. W najgorszym przypadku, przekształcasz dane w dokładnie taki sam xml, ale sortujesz. Tak długo, jak płacisz karę transformacji, możesz rozważyć przekształcenie jej w formę bardziej użyteczną dla każdego następnego kroku.

1

Warto użyć biblioteki JavaScript, aby uzyskać gotowe funkcje w.r.t Operacje na węzłach, takie jak zmiana kolejności, sortowanie, foreach itp. Polecam YUI-3, odnieś YUI-3 NodeList.

+0

Nie ma zbyt wiele na temat jej sortowania. – lisak

11

można zamówić elementy liście węzłów, jeśli przekonwertować je na pierwszej tablicy:

var foods = xmlDoc.getElementsByTagName("food"); 
var foodsArray = Array.prototype.slice.call(foods, 0); 

Następnie można użyć metody 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; 
}); 

Jest to bardzo zależy od Schemat XML - jeśli na przykład miałbyś żywność, która była w więcej niż jednej kategorii, byłyby one sortowane tylko według pierwszej kategorii w powyższym kodzie.

+0

Wiem, że jest starszy, ale bardzo pomógł mi w rozwiązaniu problemu. Ponieważ nie przekształciłem mojej nodelisty w tablicę, nie było poprawnie sortowane w Chrome. Miałem funkcję sortowania bardzo zbliżoną do twojej, a kiedy ją przekonwertowałem, zadziałało! Dziękuję Ci bardzo! – illinoistim

Powiązane problemy