从值为空字符串的数组中删除字典(使用高阶函数)

Raj*_*r R 0 arrays dictionary higher-order-functions swift

我有一个字典数组

    var details:[[String:String]] = [["name":"a","age":"1"],["name":"b","age":"2"],["name":"c","age":""]]
    print(details)//[["name": "a", "age": "1"], ["name": "b", "age": "2"], ["name": "c", "age": ""]]
Run Code Online (Sandbox Code Playgroud)

现在,我想从值是空字符串的数组中删除字典。我已经通过嵌套的for循环实现了这一点。

    for (index,detail) in details.enumerated()
    {
       for (key, value) in detail
       {
        if value == ""
        {
            details.remove(at: index)
        }
       }
    }
    print(details)//[["name": "a", "age": "1"], ["name": "b", "age": "2"]]
Run Code Online (Sandbox Code Playgroud)

如何使用高阶函数(Map,Filter,Reduce和FlatMap)实现此目标

dfr*_*fri 6

根据您的for循环,似乎想从字典中删除details,如果任何键值对其中包含一个空的String""作为值。为此,您可以例如filter在上应用details,并作为的谓词filter,检查values每个字典的属性是否不存在""(/不存在empty String)。例如

var details: [[String: String]] = [
    ["name": "a", "age": "1"],
    ["name": "b", "age": "2"],
    ["name": "c", "age": ""]
]

let filteredDetails = details.filter { !$0.values.contains("") }
print(filteredDetails)
/* [["name": "a", "age": "1"], 
     "name": "b", "age": "2"]] */
Run Code Online (Sandbox Code Playgroud)

要么,

let filteredDetails = details
    .filter { !$0.values.contains(where: { $0.isEmpty }) }
Run Code Online (Sandbox Code Playgroud)

另外请注意:看到您使用带有几个看似“静态”键的字典数组时,我建议您考虑使用更合适的数据结构,例如custom Struct。例如:

struct Detail {
    let name: String
    let age: String
}

var details: [Detail] = [
    Detail(name: "a", age: "1"),
    Detail(name: "b", age: "2"),
    Detail(name: "c", age: "")
]

let filteredDetails = details.filter { !$0.name.isEmpty && !$0.age.isEmpty }
print(filteredDetails)
/* [Detail(name: "a", age: "1"),
    Detail(name: "b", age: "2")] */
Run Code Online (Sandbox Code Playgroud)