如何过滤字典数组

时间:2019-04-09 18:55:24

标签: swift dictionary filter

我有一个名为uniLib的库数组。这是我打印时的外观(这只是一小部分):

  

[“利蒙治大学”:“法国”,“维陶塔斯·马格努斯大学”:“立陶宛”,“塞尔基皮联邦大学”:“巴西”,“葡萄牙里斯本理工学院”:“葡萄牙”,“圣保罗大学” Buenaventura”:“哥伦比亚”,“ Universitas Widyatama”:“印度尼西亚”,“郑州工业大学”:“中国”]

我们有一个包含相应国家/地区的大学的列表,我想按国家/地区过滤此词典,例如“ france”,我应该获得一个新的词典列表(如果可能的话,也可以是大学列表)。我对Swift很陌生。我已经逛了一会儿了,但找不到任何解决该问题的方法。

这是我的数组的外观及其定义:

universityNames =  json[].arrayValue.map {$0["name"].stringValue}
countryNames =  json[].arrayValue.map {$0["country"].stringValue}

// merge arrays
var uniLib : [String:String] = [:]
for (index, element) in universityNames.enumerated() {
uniLib[element] = countryNames[index] }

2 个答案:

答案 0 :(得分:1)

您可以这样做:)。

let universities = ["Université de Limoges": "France", "Vytautas Magnus University": "Lithuania", "Universidade Federal de Sergipe": "Brazil", "Instituto Politécnico de Lisboa": "Portugal", "Universidad de San Buenaventura": "Colombia", "Universitas Widyatama": "Indonesia", "Zhengzhou University of Technology": "China"]

func filterUniversities(country: String) -> [String] {
    return universities
        .compactMap { tuple in
            return tuple.value == country ? tuple.key : nil
        }
}

print(filterUniversities(country: "France"))

这将返回["Université de Limoges"],我希望您根据这个问题正在寻找什么。

根据评论更新了解决方案:

我不确定100%的预期结果是什么,所以我创建了两个变体:

let allUniversities = [
    ["Université de Limoges": "France", "Universidad de San Buenaventura": "Colombia", "Universitas Widyatama": "Indonesia", "Zhengzhou University of Technology": "China"],
    ["Universidade Federal de Sergipe": "Brazil", "Vytautas Magnus University": "Lithuania"],
    ["Instituto Politécnico de Lisboa": "Portugal", "Sorbonne": "France"]
]

func filterUniversities(country: String) -> [String] {
    return allUniversities
        .lazy
        .reduce([String]()) { (result, universities) in
            let filteredUniversities = universities.compactMap { $0.value == country ? $0.key : nil }

            return result + filteredUniversities
        }
}

print(filterUniversities(country: "France"))

func filterUniversityDictionaries(country: String) -> [[String: String]] {
    return allUniversities.lazy.filter { $0.values.contains(country) }
}

print(filterUniversityDictionaries(country: "France"))

这将为您提供以下结果:

["Université de Limoges", "Sorbonne"]

[["Zhengzhou University of Technology": "China", "Universidad de San Buenaventura": "Colombia", "Université de Limoges": "France", "Universitas Widyatama": "Indonesia"], ["Instituto Politécnico de Lisboa": "Portugal", "Sorbonne": "France"]]

答案 1 :(得分:0)

uniLib.lazy                         // Lazy so we don't have to allocate a temporary
    .filter { $0.value == country } // Find key/value pairs where value == country
    .map { $0.key }                 // Return the key (name)

在这里打扰lazy的唯一原因是如果uniLib很大,并且filter步骤将倾向于找到很多元素。不用偷懒,filter会创建一个临时词典,并立即将其丢弃。