AS3 лучший способ пройти / найти глубоко вложенные объекты - PullRequest
1 голос
/ 28 ноября 2011

У меня есть функция, которая должна находить и извлекать вложенные объекты и хотела бы знать, есть ли какая-то оптимизированная функция для этого. В E4X / XML у нас есть функции, такие как содержит или потомки. Я ничего не могу найти для нативных объектов AS3.

Один из примеров объекта выглядит примерно так:

[56] (Object)#2262
ID = "Story_u1cac"
Story = (Array)#2263
  [0] (Object)#2264
    AppliedNamedGrid = "n"
    AppliedTOCStyle = "n"
    InCopyExportOption = (Array)#2265
      [0] (Object)#2266
        IncludeAllResources = false
        IncludeGraphicProxies = true
    Self = "u1cac"
    StoryPreference = (Array)#2267
      [0] (Object)#2268
        FrameType = "TextFrameType"
        OpticalMarginAlignment = true
        OpticalMarginSize = 12
        StoryDirection = "LeftToRightDirection"
        StoryOrientation = "Horizontal"
    StoryTitle = "$ID/"
    TrackChanges = false
    XMLElement = (Array)#2269
      [0] (Object)#2270
        MarkupTag = "XMLTag/mehr_1_story"
        ParagraphStyleRange = (Array)#2271
          [0] (Object)#2272
            AppliedParagraphStyle = "ParagraphStyle/Lauftexte%3ainterview"
            CharacterStyleRange = (Array)#2273
              [0] (Object)#2274
                AppliedCharacterStyle = "CharacterStyle/$ID/[No character style]"
                BaselineShift = 4
                Content = (Array)#2275
                  [0] (Object)#2276
                    nodeValue = "p"

Есть идеи?

Любая помощь более чем оценена !!

Ответы [ 2 ]

4 голосов
/ 28 ноября 2011

Для as3 уже есть много классов утилит с глубокой трассировкой. Вот простой фрагмент, может быть, это поможет вам:

// some testdata object
var testData:Object = {myObject:{yourVar:"level1"},testObject:"root level",anotherObject:{nestedC:{myVar:"level 2"},greatObject:{otherVar:3,nestedD:{anotherVar:"level3"}}}};

function logDeep(object:*, level:uint = 0):String {
    var retval:String = "";
    for(var item:* in object) {
        if (typeof(object[item]) == "object") {
            retval += getTabs(level) + "[" + level + "]: " + item + " (" + typeof(object[item]) + ")\n";
            retval += logDeep(object[item], level + 1);
        } else {
             if (typeof(object[item]) != "string") retval += getTabs(level) + " - " +  item + " : " + object[item] + " (" + typeof(object[item]) + ")\n";
             else retval += getTabs(level) + " - " +  item + " : '" + object[item] + "' (" + typeof(object[item]) + ")\n";
        }
    }
    return retval;
}

function getTabs(level:uint = 0):String {
    var retval:String = "";
    while (level--) retval+= "\t"
    return retval;
}

// output it to trace-window.
trace(logDeep(testData));
0 голосов
/ 28 ноября 2011

Итак, используя метод, описанный выше Марком Кнолом, я смог создать своего рода глубокий Фильтр объектов.Код следует:

function filterObj(object:*, filter:String, arr:Array = null):Array {
        if(arr == null) arr = new Array;

        for(var item:* in object) {
            if(object[item] is Array){
                for(var i:int = 0; i < object[item].length; i++){
                    if(item == filter) {
                        arr.push("some property on some deep nested object");
                    }
                    filterObj(object[item][i], filter, arr);
                }
            }else{
                filterObj(object[item], filter, arr);
            }
        }
        return arr;
    }

с помощью этого метода я могу обойти любое дерево объектов и выдвинуть все необходимые свойства.Недостатком является то, что если я нажимаю «Объекты», очевидно, что вложенные объекты попадут внутрь родителей, создавая издержки на копии…

надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...