2011-11-28 38 views
1

我有一个函数需要找到并检索dep嵌套对象,并想知道是否有一些优化的函数来做到这一点。 在E4X/XML中,我们有像包含或后代的函数。我无法找到任何本地AS3对象。对象的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" 

什么想法?

任何帮助是超过apreciated!

回答

1

因此,使用由Mark Knol的上面贴的方法我能箱子一种深深的对象过滤器。 代码如下:

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; 
    } 

用这种方法I'm能够遍历任何对象树并推动所有需要的特性。 的缺点是,如果我推的对象,显然嵌套对象会在家长中产生复印件上的开销......

希望它能帮助:)

4

as3已经有很多深度跟踪util类。下面是一个简单的片段,也许这可以帮助你:

// 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

嘿马克!谢谢你的片段!我想从主对象中提取对象,如果它们符合某些标准的话......我稍微改变了你的函数并做了一个过滤器。我不能发表评论,所以我会作为答复发布......顺便说一句,我是你的工作和你的博客的粉丝!感谢发电机;) – Drala