2017-08-10 164 views
0

迅速比較字典值

[["OptionId": 824, "QuestionId": 208], 
["OptionId": 810, "QuestionId": 205], 
["OptionId": 1017, "QuestionId": 257], 
["OptionId": 0, "QuestionId": 201], 
["OptionId": 0, "QuestionId": 199], 
["OptionId": 0, "QuestionId": 200]] 

我已經通過這些值迭代類型的字典的數組和提取的字典值

["OptionId": 824, "QuestionId": 208] 
["OptionId": 810, "QuestionId": 205] 
["OptionId": 1017, "QuestionId": 257] 
["OptionId": 0, "QuestionId": 201] 
["OptionId": 0, "QuestionId": 199] 
["OptionId": 0, "QuestionId": 200] 

現在,我想要得到的「QuestionId 「對於所有那些」OptionId「,它們是0.我怎樣才能比較字典鍵值爲零?提前致謝。

這是我到目前爲止已經試過:

for dictionary in arrayofDict { 
    print(dictionary) 
    if (dictionary["OptionId"] == 0) { 
     print("option not selected") 
    } 
} 
+1

您可以發佈您嘗試過的代碼嗎? –

+0

用於arrayofDict字典{ 打印(字典) 如果(辭典[ 「OptionId」] == 0){ 打印( 「未選擇的選項」) } } } 這是我曾嘗試。 – Dyana

回答

4

您需要使用過濾器字典的陣列上獲得的字典,其中OptionId爲0,然後使用flatMap來得到相應的非可選QuestionId s。

let questionsDict: [[String:Any]] = [["OptionId": 824, "QuestionId": 208],["OptionId": 810, "QuestionId": 205], ["OptionId": 1017, "QuestionId": 257], ["OptionId": 0, "QuestionId": 201], ["OptionId": 0, "QuestionId": 199], ["OptionId": 0, "QuestionId": 200]] 
let filtered = questionsDict.filter{($0["OptionId"] as? Int) == 0}.flatMap{$0["QuestionId"] as? Int} //contains 201,200,199 
+0

我收到一個錯誤「Binary operator'=='不能應用於'Any?'類型的操作數。和'詮釋'「 – Dyana

+0

@Dyana檢查我更新的答案。你的字典沒有被賦值爲具有「Int」值,所以你需要首先將值轉換爲「Int」。 –

+0

但我的字典也包含字符串...這就是它被鑄造成[string:Any]的原因 – Dyana

0

嘗試這種情況:

arr.filter {return $0["OptionId"] == 0}.flatMap {return $0["QuestionId"]}return $0["QuestionId"]} 
+1

沒有必要安全地解開可選字典值,'Optional'符合'Equatable'協議。 –

+0

明白了。謝謝。 :) – PGDev

3

A 「過濾器+地圖」 的操作可以用單一flatMap 呼叫(避免中間陣列的創建)來完成。你的情況:

let arrayofDict = [["OptionId": 824, "QuestionId": 208], 
       ["OptionId": 810, "QuestionId": 205], 
       ["OptionId": 1017, "QuestionId": 257], 
       ["OptionId": 0, "QuestionId": 201], 
       ["OptionId": 0, "QuestionId": 199], 
       ["OptionId": 0, "QuestionId": 200]] 

let notSelected = arrayofDict.flatMap { $0["OptionId"] == 0 ? $0["QuestionId"] : nil } 

print(notSelected) // [201, 199, 200] 
+0

對我來說,這是一條規則:如果'filter'&'map',然後'flatMap',你認爲它總是正確的? :) –

+0

@AhmadF:你*可以*總是結合它,但我不願意說一個人總是應該這樣做。使用複雜/嵌套的過濾器/映射可能會降低代碼的可讀性。使用'lazy'是避免創建中間數組的另一種方法。 –

0

您可以使用過濾器如下:

讓searchPredicate = NSPredicate(格式爲: 「OptionId ==%@」,NSNumber.init(值:0)) 讓filteredArray = arrayofDict.filter {searchPredicate.evaluate(with:$ 0)}; let result = filteredArray.flatMap {$ 0 [「QuestionId」]}