Swift中嵌套数组筛选isSelected为true的分类数据如何实现?
问题分析
你现有代码的核心问题是用错了高阶函数:flatMap会把每个遍历元素返回的数组直接打平合并,你直接返回过滤后的SubCategory数组,最终结果自然是所有选中子分类的一维集合,完全丢失了外层category_name的结构信息。
实现代码
你可以用compactMap配合子数组过滤实现需求,代码如下:
let filtered = itemModelArray.compactMap { item in // 过滤当前分类下所有选中的子分类 let selectedSubs = item.sub_category.filter { $0.isSelected } // 没有选中子分类的外层分类直接丢弃 guard !selectedSubs.isEmpty else { return nil } // 生成新的Item实例,保留原有分类名,替换为过滤后的子分类数组 return Item(cat: item.category_name, subCat: selectedSubs) }
代码逻辑说明
compactMap会自动丢弃返回为nil的元素,刚好可以把没有选中子分类的外层分类(比如你示例中category_name为空的分类)直接排除- 每个遍历步骤都生成了新的
Item对象,完全保留了原有category_name结构,仅将sub_category替换为过滤后的选中子分类数组,不会拉平结构 - 最终返回值是
[Item]类型,和你原数组的结构完全一致,符合预期输出要求
注意事项
你原代码里写的item.subCategory!和模型定义的属性名sub_category不一致,注意修正属性名拼写,避免出现运行时错误。
内容的提问来源于stack exchange,提问作者Chetan S
相关产品推荐
相关产品推荐

