Как я могу изменить / отсортировать NodeList в JavaScript? - PullRequest
7 голосов
/ 21 января 2011

У меня есть то, что я думаю, должно быть простым вопросом;позвольте мне быстро объяснить:

В моем 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 в массив, так как мне придется переписывать много более позднего кода.Производительность на самом деле не так важна, так что не стесняйтесь клонировать / вложенные циклы сколько хотите.Спасибо за ваше время.

Ответы [ 3 ]

12 голосов
/ 21 января 2011

Вы можете упорядочить элементы 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;
});

ThisХотя он сильно зависит от вашей XML-схемы - если, например, у вас есть продукты, относящиеся к более чем одной категории, они будут отсортированы только по первой категории в приведенном выше коде.

1 голос
/ 21 января 2011

Рекомендуется использовать библиотеку Javascript для получения готовых функций с такими операциями списка узлов, как переупорядочение, сортировка, foreach и т. Д. Я бы порекомендовал YUI-3, см. YUI-3 NodeList .

0 голосов
/ 21 января 2011

Взгляните на это: Xml, xsl Javascript sorting . В худшем случае вы преобразуете данные в точно такой же XML, но отсортированный. Пока вы платите штраф за преобразование, вы можете подумать о том, чтобы преобразовать его в форму, более полезную для любого следующего шага.

...