2010-12-23 3 views
0

Это была проблема для меня ...обмен узлами в лифте узлов

У меня есть набор узлов в XML-документе. Мне нужно отсортировать их на основе определенного значения узла. Поэтому, если я перебираю узлы, а затем значение узла соответствует моим критериям, я хочу, чтобы он дошел до конца.

Проблема, конечно же, как только я поменяю местами, поскольку узлы находятся в живом наборе, указатель итерации пропускает одну запись, конечно, поскольку appendChild работает в реальном времени.

Это мой код до сих пор, но, как я уже сказал, это может пропустить запись из-за свопинга:

for (var i=1; i <= nElem; i++) 
{ 
    var node = getNode(dom,"//item[" + i + "]"); 
    var state = getNodeValue(dom,"//item[" + i + "]/state"); 
    if ((state != 'XX') && (i != nElem)) 
    { 
     node.parentNode.appendChild(node);    
    } 
} 

То, что я на самом деле хочу, чтобы все элементы в состоянии «XX» находятся на вершине ,

У кого-нибудь есть разумная идея? Благодаря

ответ

1

Вы можете использовать array.sort() и передать пользовательские процедуры сортировки:

  • var nodes = getNode(dom, "//item"); получает вас массив элементов
  • рядом, удалить записи в nodes из йот
  • сделать nodes.sort(sortfunction) где sortfunction является sortfunction(a,b)
  • реализовать sortfunction так, что она возвращает
    • -1, если должна быть ниже, чем б
    • 0, если равно
    • 1, если должна быть выше, чем б
  • добавить записи из nodes назад к РОМ

I подумайте, что бы это сделало (пока я чего-то не пропустил).

+0

Это лучшее, что я придумал. Проблема в том, что мои узлы не разделяют одного и того же родителя обязательно (в то время как они должны: это ошибка в нашем поставщике ... никаких шансов получить это изменение в ближайшее время). Поэтому я не могу просто удалить их, а затем вернуть их обратно ... но, возможно, я все равно сделаю это (EDIT: с помощью одного и того же родителя) – faboolous

Смежные вопросы