【问题标题】:Comparing dictionary values swift快速比较字典值
【发布时间】:2017-08-10 09:32:49
【问题描述】:

我有一个类型的字典数组

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

现在,我想为所有为 0 的“OptionId”获取“QuestionId”。如何将字典键值与零进行比较?提前致谢。

这是我迄今为止尝试过的:

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

【问题讨论】:

  • 你能把你试过的代码贴出来吗?
  • for dictionary in arrayofDict { print(dictionary) if (dictionary["OptionId"] == 0) { print("option not selected") } } } 这是我尝试过的。跨度>

标签: ios arrays swift dictionary


【解决方案1】:

一个“过滤器+映射”操作可以用一个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]

【讨论】:

  • 对我来说,这是一个规则:如果filter & map,那么flatMap,你认为它总是正确的吗? :)
  • @AhmadF:你可以总是把它结合起来,但我不愿意说一个人总是应该这样做。例如,使用复杂/嵌套的过滤器/映射可能会降低代码的可读性。使用lazy 是避免创建中间数组的另一种选择。
【解决方案2】:

你需要对字典数组使用过滤器来获取字典,其中OptionId为0,然后使用flatMap获取对应的非可选QuestionIds。

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 检查我更新的答案。您的字典未强制转换为具有 Int 值,因此您需要先将值强制转换为 Int
  • 但我的字典也包含字符串...这就是它被转换为 [string:Any] 的原因
  • 你的例子只包含Ints。无论如何,自上次编辑以来,我的答案在 [String:Any] 上有效,因此您可以安全地使用它。
【解决方案3】:

试试这个:

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

【讨论】:

  • 不需要安全地解开可选的字典值,Optional符合Equatable协议。
【解决方案4】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 2021-02-07
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多