代码之家  ›  专栏  ›  技术社区  ›  Cesare

从具有数组作为值的字典中获取值

  •  0
  • Cesare  · 技术社区  · 6 年前

    我有一本字典,其中包含语言作为值,每个语言名称(a,b,c,…)的初始字符作为键。

    var dictionary = [Character: [Language]]()
    

    我想以数组的形式把字典里所有的语言都取出来。这么做,我知道

    let languages = dictionary.values // Dictionary<Character, [Language]>.Values
    

    那不是数组。我试着得到这样的阵列

    let languages = Array(tableViewSource.values) // [[Language]]
    

    这将返回数组的数组。我怎么才能得到一系列的语言呢?我看到了 merge(_:uniquingKeysWith:) 但我不需要合并字典。

    3 回复  |  直到 6 年前
        1
  •  2
  •   Shehata Gamal    6 年前

    你可以试试

    let allLangs = nestedArr.reduce([], +)
    
        2
  •  1
  •   Mr. Xcoder    6 年前

    Martin R's Sh_Khan's 答案概述了执行此操作的标准方法(您基本上只想展平一个数组)。不过,我想展示一种更“手动”的方法:

    var langs = [String]()
    for lang_list in dictionary.values {
        langs.append(contentsOf: lang_list)
    }
    

    或者,您可以使用 += 运算符而不是 .append(contentsOf:) . 更简单的方法是 flatMap(_:) :

    dictionary.values.flatMap { $0 }
    
        3
  •  1
  •   Martin R    6 年前

    如果需要单个数组(连接所有字典值),则

    Array(dictionary.values.joined())
    

    做到了。(这将创建最终数组,而不创建任何其他中间数组。)

    例子:

    let dictionary: [Character: [String]] = ["E": ["espanol", "english"], "G": ["german", "greek"]]
    let langs = Array(dictionary.values.joined())
    print(langs) // ["german", "greek", "espanol", "english"]
    

    请注意,字典中键/值对的顺序未指定。 另一种选择是

    let dictionary: [Character: [String]] = ["E": ["espanol", "english"], "G": ["german", "greek"]]
    let langs = dictionary.keys.sorted().flatMap { dictionary[$0]! }
    print(langs) // ["espanol", "english", "german", "greek"]
    

    它给出了按相应键排序的语言。