根据以特定字符结尾的散列键存储的值

时间:2016-07-28 15:26:21

标签: swift hash swift2

我有一个[String: [String: AnyObject]]()类型的哈希,如下所示,

{ 
  "asndfkjsndkjnf_1": {"A": "2"}, 
  "jckxjbcvkjbsdsdfkz_2": {"G": 3},
  "sahgkshbgskdssjf_3": {"T": '1'},
  "asdhlsfldsnfsldk_4": {"C": 4}
}

我想选择其键以"_1"结尾的哈希条目的值,因为哈希没有索引我发现在不知道完整密钥的情况下检索我想要的项目有点困难。< / p>

2 个答案:

答案 0 :(得分:1)

Dictionary有一个keys属性,可让您(懒惰地)评估字典中的所有键,因此您只需使用:

let foo = [
    "asndfkjsndkjnf_1": ["A": "2"],
    "jckxjbcvkjbsdsdfkz_2": ["G": 3],
    "sahgkshbgskdssjf_3": ["T": "1"],
    "asdhlsfldsnfsldk_4": ["C": 4]
]

if let match = foo.keys.filter({ (key) -> Bool in key.hasSuffix("_1") }).first {
    // foo[match] will be the first matched dictionary
    print("\(foo[match])")
}

另一种可能性是只过滤整个字典以匹配键:

foo.filter({ $0.0.hasSuffix("_1") }).first?.1

答案 1 :(得分:0)

使用可选绑定从字典中获取值的常规方法:

let dict: [String:AnyObject] = [
    "asndfkjsndkjnf_1": ["A": "2"],
    "jckxjbcvkjbsdsdfkz_2": ["G": 3],
    "sahgkshbgskdssjf_3": ["T": "1"],
    "asdhlsfldsnfsldk_4": ["C": 4]
]

if let innerDict = dict["asndfkjsndkjnf_1"] as? [String:AnyObject] {
    print(innerDict)
    if let valueA = innerDict["A"] as? String {
        print(valueA)
    }
}

但在评论中你说

  

我不知道检索值的完整密钥,我只知道哈希的密钥以某种模式结束

您可以使用.hasSuffix()查找哪个键以某个字符串结尾,然后使用此键获取内部值。

假设您要查找以“_3”结尾的键的值:

for key in dict.keys where key.hasSuffix("_3") {
    if let innerDict = dict[key] as? [String:AnyObject] {
        print(innerDict)
        if let innerValue = innerDict["T"] as? String {
            print(innerValue)
        }
    }
}