假设我有一个字典数组,每个都包含一系列字母。像这样:
let dicts = [["letters" : ["a","b","c"]],
["letters" : ["d","e","f"]]]
创建所有字典中所有字母的扁平数组的最有效方法是什么?
答案 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"]