2011-01-21 31 views
6

Tengo lo que creo que debería ser una pregunta directa; Permítaseme explicar:¿Cómo puedo reordenar/ordenar una NodeList en JavaScript?

En mi JavaScript, food.xml se lee con:

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

modo que ahora tengo un NodeList xmlFoodList con todos los elementos del alimento. Genial hasta ahora. El problema es que quiero ordenar los nodos basados ​​en un elemento <category> dentro. Puedo leer que con:

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

Más adelante en mi código, los alimentos que se muestran en una lista, y como era de esperar, quiero comida de la misma categoría que se enumeran juntos. Entonces, mi pregunta es: ¿Cómo puedo reordenar los nodos en xmlFoodList según su categoría?

Notas: No puedo cambiar food.xml entrando, y no quiero editar mi código posterior para hacer la ordenación a medida que se completa la lista. No quiero convertir NodeList en una matriz, ya que tendría que volver a escribir mucho código posterior. El rendimiento en realidad no es una gran preocupación, así que siéntete libre de clonar/anidar todo lo que quieras. Gracias por tu tiempo.

Respuesta

0

Echa un vistazo a esto: Xml, xsl Javascript sorting. En el peor de los casos, transforma los datos en exactamente el mismo xml, pero ordenados. Mientras pague la penalización de transformación, podría considerar transformarla en una forma más útil para lo que sea el siguiente paso.

1

Es una buena idea usar una biblioteca Javascript para obtener funciones confeccionadas w.r.t lista de nodos operaciones como la reordenación, la clasificación, foreach, etc. Recomendaría Yui-3, consulte YUI-3 NodeList.

+0

no hay mucho sobre ordenarlo – lisak

11

Puede ordenar los elementos de la lista NodeList, si se les convierte en una matriz primero:

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

continuación, puede utilizar la sort método:

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; 
}); 

Esto depende altamente de su Sin embargo, el esquema XML - si, por ejemplo, tuviera alimentos que estaban en más de una categoría, solo se ordenarían por la primera categoría en el código anterior.

+0

Sé que esto es más antiguo, pero me ayudó mucho con el problema que estaba teniendo. Como no había convertido mi lista de nodos en una matriz, no estaba correctamente ordenada en Chrome. Tenía una función de ordenamiento muy cercana a la tuya, ¡y una vez que la convertí, funcionó! ¡Muchas gracias! – illinoistim

Cuestiones relacionadas