You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:25:57