从字典数组中提取元素

时间:2019-01-30 03:00:49

标签: arrays swift dictionary

我有很多字典。从这里我要提取单个元素

以下代码生成具有多个字典的数组。我需要从中提取与某个键匹配的值。

使用的代码:

return array.filter{namePredicate.evaluate(with: $0)}

这看起来像:

  

[[“” a:“ 1”,“ b”:“ 2”,“ c”:3],[“ a”:“ 3”,“ b”:“ 4”,“ c”:5 ]]

我需要从中提取键“ a”的值,即1、3。我该如何处理?

4 个答案:

答案 0 :(得分:1)

使用compactMap

let aValues = filteredArray.compactMap { $0["a"] }

其中filteredArrayarray.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}