Swift嵌套结构体数组的元素筛选与子数组精准过滤问题
解决Swift中筛选结构体数组并保留指定子元素的问题
你当前的代码用filter成功筛选出了包含目标arrSub元素的test实例,但filter的作用仅仅是筛选实例,不会对实例内部的arr数组做修改。要实现“保留符合条件的test实例,且每个实例的arr仅保留目标arrSub元素”的需求,我们需要在筛选的同时对实例进行转换——创建新的test实例,替换掉它的arr属性。
具体实现代码
因为你的test结构体中arr是不可变的let属性,所以我们需要生成新的test实例来替换原实例的arr。这里用compactMap可以一步完成筛选和转换,效率更高:
import UIKit struct arrSub { let sub_txt: String } struct test { let name: String let arr: [arrSub] init(name: String, arr: [arrSub]) { self.name = name self.arr = arr } } var testArr = [test]() testArr.append(test(name: "Line 1", arr: [arrSub(sub_txt: "Line 1, 1"), arrSub(sub_txt: "Line 1, 2")])) testArr.append(test(name: "Bell 2", arr: [arrSub(sub_txt: "Bell 2, 1"), arrSub(sub_txt: "Bell 2, 2")])) testArr.append(test(name: "Bell 2", arr: [arrSub(sub_txt: "Test 2, 1"), arrSub(sub_txt: "Test 2, 2")])) // 核心修改部分 let targetText = "Test 2, 2" let new = testArr.compactMap { testInstance in // 筛选当前test实例中符合条件的arrSub元素 let filteredSubArr = testInstance.arr.filter { $0.sub_txt == targetText } // 如果有符合条件的元素,就返回新的test实例;否则返回nil(被compactMap自动过滤) guard !filteredSubArr.isEmpty else { return nil } return test(name: testInstance.name, arr: filteredSubArr) } print(new) // 预期输出:[(name: "Bell 2", arr: [arrSub(sub_txt: "Test 2, 2")])]
代码解释
compactMap:遍历原数组,对每个元素执行闭包逻辑,自动过滤掉返回nil的元素,最终生成新数组- 先对每个
testInstance的arr进行二次筛选,只保留sub_txt等于目标文本的arrSub元素 - 通过
guard判断筛选后的子数组是否为空:为空说明当前test实例不符合要求,返回nil被过滤;不为空则创建新的test实例(复用原实例的name,替换为筛选后的arr)
如果你的test结构体允许将arr改为可变的var属性,也可以先筛选出实例再遍历修改,但考虑到原代码中arr是不可变的,创建新实例是更安全的做法。
内容的提问来源于stack exchange,提问作者Valeriy
相关产品推荐
相关产品推荐

