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