压缩包含数组的字典数组的最有效方法

时间:2017-04-18 05:15:55

标签: swift

假设我有一个字典数组,每个都包含一系列字母。像这样:

let dicts = [["letters" : ["a","b","c"]],
             ["letters" : ["d","e","f"]]]

创建所有字典中所有字母的扁平数组的最有效方法是什么?

3 个答案:

答案 0 :(得分:2)

您可以使用reduce(_:_:)

let array = dicts.reduce([]) { $0 + ($1["letters"] ?? []) }
print(array) // ["a","b","c","d","e","f"]

编辑由于@Hamish建议注释中的链接最简单的解决方案是花费更少的时间,因此如果您拥有大量数据,那么您可以使用forEach数组封闭。< / p>

var result = [String]()
dicts.forEach {      
    result.append(contentsOf: $0["letters"] ?? [])
}

答案 1 :(得分:2)

您可以使用using System.Linq; ... string result = arg.LastOrDefault(item => !string.IsNullOrEmpty(item)) ?? ""; 将每个字典映射到相应的字典 字母数组并加入结果:

flatMap()

这是有效的,因为没有额外的中间阵列 在加入期间创建。正如@Hamish在下面指出的那样

可以避免使用中间let dicts = [["letters" : ["a","b","c"]], ["letters" : ["d","e","f"]]] let letters = Array(dicts.flatMap { $0["letters"] }.joined()) print(letters) // ["a", "b", "c", "d", "e", "f"]
[[String]]

答案 2 :(得分:1)

您可以使用其中任何一种。您无需指定字典的密钥名称。

解决方案1 ​​

    let array = dicts.reduce([]) { $0 + ($1.values.reduce([]) { $0 + $1 }) }
    print(array) // ["a","b","c","d","e","f"]

解决方案2

    let array = dicts.flatMap { $0.values.joined() }
    print(array) // ["a","b","c","d","e","f"]