![]() |
|
||||||||||
|
|
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Подозреваю, задачка пустяковая, но нет времени глубоко зарываться в документацию.
Есть два объекта XML (profile и update): <profile> <user>Ivan</user> <userID>123123123123</userID> <level>2</level> <balance>1000</balance> </profile> <update> <level>3</level> <balance>1400</balance> </update> - все узлы в profile, присутствующие в update, обновились значениями из update - все узлы в profile, отсутствующие в update, остались в прежнем виде Т.е., итогом операции является объект XML вида <profile> <user>Ivan</user> <userID>123123123123</userID> <level>3</level> <balance>1400</balance> </profile> Как проще сделать? |
|
|||||
|
Регистрация: Dec 2012
Сообщений: 100
|
если это с сервака прилетает (хотя думаю тут других вариантов и нет), тогда проще сразу с сервака засылать второе один раз чем два раза первое
|
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Объект profile живет в клиенте и там порядка трех десятков параметров.
С сервера прилетает update и в нем как правило по три-пять параметров, которые требуют обновления, а остальные не трогаются. Как раз хочу уйти от перекидывания лишних параметров. |
|
|||||
|
Регистрация: Dec 2012
Сообщений: 100
|
тогда закидывайте оба листинга в объект типа xml, а затем создайте метод в котором будут заменяться одни значения (в одном объекте xml) на другие (из другого объекта xml)
|
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Так вопрос в методе и заключался. ))
Вот такое решение получилось private function refreshXML(basicXML:XML, update:XML) : XML { for (var i:int = 0; i < basicXML.children().length(); i++) { var basicNode:XML = XML(basicXML.children()[i]); for (var j:int = 0; j < update.children().length(); j++) { var updateNode:XML = XML(update.children()[j]); if (basicNode.name() == updateNode.name()) { basicXML.replace(basicNode.childIndex(),updateNode); } } } return basicXML; } |
|
|||||
|
Регистрация: Dec 2012
Сообщений: 100
|
Условный оператор, который сравнивает имена xml-объектов тут явно лишний, т.к. возвращаемые объекты имён у них в любом случае будут разные, значит это условие никогда не выполнится, как следствие данные никогда не обновятся
Добавлено через 4 минуты хотя нет, извините, всё правильно, я просто не обратил внимание на переменные, которые вы объявляете внутри цикла Добавлено через 15 минут Незнаю насколько это будет проще, но по некторым источникам цикл while в обратном порядке выполняется немного быстрее чем for прямом порядке, и ещё один момент: будет эффективнее если длину массива запросить единожды чем кажды раз. Хотя мне думается что это такие незначительные нюансы, которые не особо важны. Например так: private function refreshXML(basicXML:XML, update:XML) : XML { var i:int = basicXML.children().length(); var j:int; var basicNode:XML; var updateNode:XML; while (--i > -1) { basicNode = XML(basicXML.children()[i]); j:int = update.children().length(); while (--j > -1) { updateNode = XML(update.children()[j]); if (basicNode.name() == updateNode.name()) { basicXML.replace(basicNode.childIndex(),updateNode); } } } return basicXML; } |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Да, но это все равно перебором.
|
|
|||||
|
Регистрация: Dec 2012
Сообщений: 100
|
|
|
|||||
|
Зачем перебирать свойства profile? Если имена нод уникальны:
__________________
משיח לא בא משיח גם לא מטלפן |
|
|||||
|
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
да, действительно работает
|
![]() |
![]() |
Часовой пояс GMT +4, время: 00:28. |
|
|
« Предыдущая тема | Следующая тема » |
|
|