|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Выявление отличий одного Object`а от другого?!
Доброе время суток,
...родился следующий вопрос: Не поделится ли кто рабочей функцией, которая сравнивала два Object`а и отображала на выходе их разницу. var objOriginal:Object = { a: "a", b: "1", c: { sub1: false, sub2: { x:10, y:20, z:null } } } var objChanged:Object = { a: "a", b: "2", c: { sub1: false, sub2: { x:10, y:20, z:{ z_param: [1,2,3,4, "last"] } } } } var objResult:Object = theSuperFunction(objOriginal, objChanged); // OUTPUT objResult == { b:2, c:{ sub2:{ z:{ z_param: [1,2,3,4, "last"] } } } } Ни у кого случаем нет такой на вооружение? |
|
|||||
Я думаю что не нужно конструировать универсальный метод. Это явно не пойдет на пользу.
Куда лучше использовать типизированные объекты, и соответствующие методы сравнения.
__________________
adobe AS3 manual |
|
|||||
Моя необходимость в "такой" функции в следующем:
1. У меня есть Object модель данных; 2. На протяжении работы приложения модель терпит изменения; 3. В результате работы приложения я хочу видеть только измененные участки модели; |
|
|||||
Всё равно направлю в ту же степь: Создайте типизированный объект, и с помощью getter/setter следите за тем что изменилось.
Добавлено через 1 минуту Если ваша "модель" действительно модель, то можете вообще объявить её синглтоном.
__________________
adobe AS3 manual |
|
|||||
блогер
Регистрация: Jun 2005
Адрес: Господи пожалуйста не Новосибирск
Сообщений: 6,598
Записей в блоге: 17
|
Разомнул мозги.
Метод может не создавать полные копии объектов в объектах, если в оригинале он null - просто пишет в результирующий объект ссылку. package { import artshlagin.utils.Tracer; import flash.display.Sprite; import flash.events.Event; /** * ... * @author Artem Shlagin */ public class Main extends Sprite { public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); var objOriginal:Object = { a: "a", b: "1", c: { sub1: false, sub2: { x:10, y:20, z:null } } } var objChanged:Object = { a: "a", b: "2", c: { sub1: false, sub2: { x:10, y:20, z:{ z_param: [1,2,3,4, "last"] } } } } var objResult:Object = theSuperFunction(objOriginal, objChanged); Tracer.fullTraceObject(objResult); } private function theSuperFunction(objOriginal:Object, objChanged:Object):Object { var result:Object = { }; if (!objOriginal) return objChanged; for (var name:String in objOriginal) { if (!(name in objChanged)) continue; if (isComposite(objOriginal[name])) { if (!isComposite(objChanged[name])) result[name] = objChanged[name]; else{ var temp:Object = theSuperFunction(objOriginal[name], objChanged[name]); if (!isEmpty(temp)) result[name] = temp; } } else { if (objChanged[name] !== objOriginal[name]) result[name] = objChanged[name]; } } return result; } /** * Что-то не пришло в голову лучшего способа проверки на хэш * @param object * @return */ private function isComposite(object:*):Boolean { return typeof object === "object"; } private function isEmpty(temp:Object):Boolean { for (var name:String in temp) { return false; } return true; } } } package artshlagin.utils { /** * ... * @author Artem Shlagin */ public class Tracer { public static var traceFunction:Function = trace; public static var nameDelimiter:String = " => "; public function Tracer() { throw new Error("Class is static"); } public static function fullTraceObject(object:Object):void { recoursiveTrace(object); } private static function recoursiveTrace(o:Object, startValue:int = 0):void { for (var name:Object in o) { var otst:String = ""; if (startValue > 0) { var i:int = startValue; while (i--) otst += " "; } traceFunction.call(null, otst + name + nameDelimiter + o[name]); if ((typeof o[name]) === "object") recoursiveTrace(o[name], startValue+1); } } } } Но не ручаюсь за правильность работы во всех ситуациях.
__________________
Тут мужик танцует и поёт про флэш |
|
|||||
Это не просто, на самом деле там очень широкая и динамичная иерархия объектов, они сами по себе вносят изменения напрямую в модель (каждый в свою ветку), многие объекты даже не могут иметь геттеры/сеттеры потому что являются частью swc и финализированных классов. Так что тут без вариантов )
Добавлено через 24 минуты Psycho Tiger, спасибо за код - пригодился! |
Часовой пояс GMT +4, время: 01:16. |
|
« Предыдущая тема | Следующая тема » |
Теги |
object |
|
|