Swift如何筛选数组中满足_tisk>0且_chodnazev为指定值的元素?
Swift数组筛选:满足_tisk>0且_chodnazev为指定值的记录
针对你的需求,你可以通过Swift的filter和map(或flatMap)方法组合实现筛选,以下是两种常见的实现方式:
方式一:保留原(key, value)结构,仅筛选符合条件的元素
如果需要保持原有的[(key: String, value: [polozkyUcet])]结构,只过滤每个value数组中符合条件的记录,并可选择移除空数组的条目:
override func viewDidLoad() { super.viewDidLoad() let test = [(key: "Předkrm", value: [polozkyUcet(_id: 456037, _masterid: 145138, _rcptid: 19276, _mnozstvi: "1", _delene_mnozstvi: "0", _recept: "ŠKVARKOVÁ POMAZÁNKA", _cena: 85.0, _tisk: -1, _chod: 1, _chodnazev: "Předkrm", _host: "0", _popis: "", _cenazak: 85.0)]), (key: "Hlavní chod", value: [polozkyUcet(_id: 456038, _masterid: 145138, _rcptid: 17828, _mnozstvi: "1", _delene_mnozstvi: "0", _recept: "PÁRKY OD KREJCARŮ,BRAMBOROVÁ KAŠE", _cena: 135.0, _tisk: -10, _chod: 10, _chodnazev: "Hlavní chod", _host: "0", _popis: "", _cenazak: 135.0)]), (key: "Dezert", value: [polozkyUcet(_id: 456039, _masterid: 145138, _rcptid: 3047, _mnozstvi: "0,5", _delene_mnozstvi: "0", _recept: "RAKVIČKA SE ŠLEHAČKOU", _cena: 20.0, _tisk: -30, _chod: 30, _chodnazev: "Dezert", _host: "0", _popis: "", _cenazak: 40.0), polozkyUcet(_id: 456112, _masterid: 145138, _rcptid: 1117, _mnozstvi: "1", _delene_mnozstvi: "0", _recept: "KAPR FILET NA KMÍNĚ", _cena: 168.0, _tisk: 30, _chod: 30, _chodnazev: "Dezert", _host: "0", _popis: "", _cenazak: 168.0)])] sorted_polozky = test // 执行筛选 let filteredPolozky = sorted_polozky.map { item in // 筛选当前分组中符合条件的记录 let validItems = item.value.filter { polozka in polozka._tisk > 0 && (polozka._chodnazev == "Předkrm" || polozka._chodnazev == "Dezert") } return (key: item.key, value: validItems) } // 可选:移除筛选后无有效记录的分组 .filter { !$0.value.isEmpty } print(filteredPolozky) }
代码说明
map遍历原数组的每个(key, value)元组,对每个元组的value数组执行filter,筛选条件为:_tisk > 0_chodnazev等于"Předkrm"或"Dezert"
- 后续的
filter用于移除那些筛选后value为空的分组,若不需要保留空分组则加上此步骤。
方式二:直接获取所有符合条件的单条记录
如果不需要保留原分组结构,只想得到所有符合条件的polozkyUcet实例,可以用flatMap展开嵌套数组后筛选:
let allValidItems = sorted_polozky.flatMap { $0.value } .filter { $0._tisk > 0 && ($0._chodnazev == "Předkrm" || $0._chodnazev == "Dezert") } print(allValidItems)
代码说明
flatMap将原数组中所有嵌套的[polozkyUcet]数组展开为一个一维数组- 再通过
filter筛选出符合条件的记录,最终得到[polozkyUcet]类型的结果
针对你的测试数据,两种方式最终都会筛选出Dezert分组中_tisk=30的那条记录。
内容的提问来源于stack exchange,提问作者Karel Endrst
相关产品推荐
相关产品推荐

