比较Swift中字典的值

3

我有一个类型为字典的数组

[["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]

现在,我想获取所有“OptionId”为0的“QuestionId”。如何将字典键值与零进行比较?提前致谢。
这是我迄今为止尝试过的:
for dictionary in arrayofDict {
    print(dictionary)
    if (dictionary["OptionId"] == 0) {
        print("option not selected")
    }
} 

1
请问您能否发布一下您尝试过的代码? - Mohammad Sadiq
针对数组中的每个字典,执行以下操作: 打印字典 如果该字典中的“OptionId”等于0,则打印“未选择选项” } 这是我尝试过的内容。 - Dyana
4个回答

5
使用单个 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]

对我来说,这是一种规则:如果使用了 filtermap,那么就要用 flatMap,你觉得这总是正确的吗? :) - Ahmad F
@AhmadF:你可以总是将它们组合在一起,但我不愿意说每个人都应该这么做。在复杂/嵌套的过滤器/映射中,例如可能会降低代码的可读性。使用“lazy”是另一个避免创建中间数组的选项。 - Martin R

4
你需要在字典数组上使用过滤器,以获得其中 OptionId 为 0 的字典,然后使用 flatMap 来获取相应的非可选 QuestionId
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

我遇到了一个错误:“二进制运算符“==”不能应用于类型为“Any?”和“Int”的操作数”。 - Dyana
@Dyana,请查看我的更新答案。你的字典没有被转换成 Int 值,所以你需要首先将这些值转换为 Int - Dávid Pásztor
但是我的字典也包含字符串...这就是它被转换为 [string:Any] 的原因。 - Dyana
好的,你的例子只包含了Int。无论如何,我的答案自最后一次编辑以来就适用于[String:Any],所以你可以放心使用它。 - Dávid Pásztor

1

试试这个:

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

1
不需要安全解包可选的字典值,Optional符合Equatable协议。 - Dávid Pásztor

0

您可以按以下方式使用过滤器:

let searchPredicate = NSPredicate(format: "OptionId == %@",NSNumber.init(value: 0))
let filteredArray = arrayofDict.filter { searchPredicate.evaluate(with: $0) };
let result = filteredArray.flatMap{$0["QuestionId"]}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接