我有很多字典。从这里我要提取单个元素
以下代码生成具有多个字典的数组。我需要从中提取与某个键匹配的值。
使用的代码:
return array.filter{namePredicate.evaluate(with: $0)}
这看起来像:
[[“” a:“ 1”,“ b”:“ 2”,“ c”:3],[“ a”:“ 3”,“ b”:“ 4”,“ c”:5 ]]
我需要从中提取键“ a”的值,即1、3。我该如何处理?
答案 0 :(得分:1)
使用compactMap
:
let aValues = filteredArray.compactMap { $0["a"] }
其中filteredArray
是array.filter{namePredicate.evaluate(with: $0)}
返回的数组。
答案 1 :(得分:0)
请告知,过滤器将返回与其自身数组相同的类型,映射将返回您要返回的新类型。因此,如果要使用self获得其他类型,则需要使用map函数。
在地图函数中,“ map”将返回与其自身数组相同数量的元素,“ compactMap”将删除“ nil”值。
因此,如果您确定数组中的所有“ dict”都具有需要获取的键,则可以使用map
,也可以使用compactMap
避免结果数组中的值为零。>
因此您可以使用
let arr = [["a":"1","b":"2","c":3],["a":"3","b":"4","c":5]]
let test = arr.map{$0["a"] as? String}
let test2 = arr.compactMap{$0["a"] as? String}
答案 2 :(得分:0)
如果需要对多个键进行操作,则可以制作一个合并字典,该字典将所有键映射到所有值的数组。您会丢失值的顺序,因此仅在不必要时才起作用。
func merge<Key, Value>(dicts: [[Key: Value]]) -> [Key: [Value]] {
return dicts.reduce(into: [:]) { accumalatorDict, dict in
accumalatorDict.merge(
dict.mapValues({ [$0] }),
uniquingKeysWith: { return $0 + $1 }
)
}
}
let dicts: [[String: Any]] = [
["a":"1","b":"2","c":3],
["a":"3","b":"4","c":5]
]
let mergedDicts = merge(dicts: dicts)
for (key, values) in mergedDicts {
print(key, values)
}
let allValuesForA = mergedDicts["a"]
print(allValuesForA) // => ["1", "3"]
答案 3 :(得分:-1)
尝试
let arr = [["a":"1","b":"2","c":3],["a":"3","b":"4","c":5]]
let test = arr.map{$0["a"] as? String}