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


person Chris DeHaan    schedule 21.01.2011    source источник


Ответы (3)


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

person andrewmu    schedule 21.01.2011
comment
Я знаю, что это старше, но это очень помогло мне с проблемой, с которой я столкнулся. Поскольку я не преобразовал свой список узлов в массив, он неправильно сортировался в Chrome. У меня была функция сортировки, очень близкая к вашей, и как только я ее преобразовал, она сработала! Большое спасибо! - person illinoistim; 03.05.2013

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

person Ravikiran    schedule 21.01.2011
comment
там не так много о сортировке - person lisak; 15.04.2011

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

person Chris B. Behrens    schedule 21.01.2011