2015-11-04 106 views
2

我解析網頁的評論,我得到一個嵌套 字典的數組。因此,數據具有典型的評論嵌套結構。他們中的一些人有答案,其中一些不是。有些答案也有評論。就像在方案:如何在swift中迭代嵌套字典的未知嵌套層次數?

comment1 
comment1 
    comment2 
    comment2 
    comment3 
     comment4 
     comment5 
     comment4 
    comment2 
comment1 
comment1 
    comment2 
comment1 

我知道如何通過2個或3個級別與嵌套... in語句的迭代,但我不知道該怎麼做時,嵌套層數是未知的。

基本上,我需要計算所有更高級別的嵌套字典(計劃中的comment1,第二個comment1將是7),並在每個級別解析後刪除「錯誤」的字典。 請幫忙。

更新 作爲iOS開發中的新手,我將我的字典結構顯示爲圖片。對不起,但我不知道如何從格式的Debag區域複製 dict

+0

請顯示您的實際字典結構的一個小例子。謝謝。 – Moritz

+0

@ eric-d,我用topfunky/hpple解析器解析HTML數據,所以它有點難讀 –

+0

你可以用虛假內容顯示一個例子。 :)我的觀點是:在你的關於字典結構的問題中,我沒有看到任何嵌套的字典結構,只是一堆行,所以它很難提供幫助。 – Moritz

回答

3

你可以遞歸地做到這一點。事情是這樣的:

func recursivelyAddComments(commentData: [String: AnyObject]) -> Comment { 

    //Init with the standard data for comment 
    let comment = Comment() 

    //recursivly add nested comments, calling the property with the nested array for "answers" 
    if let answersData = commentData["answers"] as? [String:AnyObject]{ 
     for answerData in answersData { 
      if let answer = recursivelyAddComments(answerData){ 
       comment.answers.append(answer) 
      } 
     } 
    } 

    return comment 
} 

所以首先函數創建從相關數據的評論,然後將其解析每個項目包含答案的意見數組中,通過調用本身與他們的數據。

0

您可以檢出下面的僞代碼。它應該給你使用堆棧來完成任務的一般想法

let dict = [String: AnyObject]() 

let stack: Array<AnyObject> 
stack.append(dict) 

while stack.count != 0 { 

     let comment = stack.popLast() as? [String: AnyObject] 

     if value == nil { 
      comment = currDict[i] as! MyObject 
      print("value: \(comment)") 
      // Do other stuff 
     } 

     for item in comment.allValues() { 
      stack.append(item) 
     } 
    } 
}