Ios 数组对象的过滤字典

Ios 数组对象的过滤字典,ios,swift,filter,Ios,Swift,Filter,我正在尝试根据用户在UISearchController中的输入筛选词典。我有以下模型和对象数组 struct People { var name: String var id: Int } let first = People(name: "Atalay", id: 1) let second = People(name: "Ahmet", id: 2) let third = People(name: "Mehmet", id: 3) let fourth = People(

我正在尝试根据用户在
UISearchController
中的输入筛选词典。我有以下模型和对象数组

struct People {
    var name: String
    var id: Int
}
let first = People(name: "Atalay", id: 1)
let second = People(name: "Ahmet", id: 2)
let third = People(name: "Mehmet", id: 3)
let fourth = People(name: "Yusuf", id: 4)
let peoples: [People] = [first, second, third, fourth, fifth]
我将它们放入字典中,用以下代码创建节索引表视图

var dict: [String: [People]] = Dictionary(grouping: peoples, by: { (people) -> String in
    return String(people.name.prefix(1))
})
上面的代码给了我一本字典,上面有
人名的第一个字母。现在,我想根据用户输入过滤我的数组。然而,我尝试了下面的代码进行过滤,但它并没有像我预期的那样工作

let filteredDict = (dict.filter { $0.1.contains { $0.name.lowercased().contains("ata") } })
它返回所有“A”字母部分索引,如
[“A”:People(姓名:“Atalay”,id:1),People(姓名:“Ahmet”,id:2)]
如何在字典中实现我的数组过滤

如何在字典中实现我的数组过滤

首先应该有一个数组,可以使用
flatMap
filteredect

let array = filteredDict.flatMap { $0.value }
然后像往常一样过滤数组

let filteredArray = array.filter { $0.name.lowercased().contains("ata") }

我决定使用一个老式的
for
循环并分别对每组进行过滤,这样做是最简单的

var filtered = [String: [People]]()

for (k, v) in dict {
    let result = v.filter {$0.name.lowercased().contains("ata")}
    if result.count > 0 {
        filtered[k] = result
    } 
}

请注意,如果要保留结果字典中的所有组,只需跳过
if result.count>0
条件

如果我没有弄错的话,您希望最终字典中的所有键和筛选的项数组都作为值。如果这是正确的,
reduce
是实现以下目标的工具:

let filtered = dict.reduce(into: [String: [People]]()) {
    $0[$1.key] = $1.value.filter { $0.name.lowercased().contains("ata") }
}

但是,我不需要新的数组,我只需要根据用户输入过滤我的旧字典。我明白了,我的错,误解了这个问题,很好,你让它工作了,祝你好运。你的解决方案对我也很有用,唯一的一件事我不需要空键。甚至投票表决你的问题谢谢!