如何过滤嵌套数组并在SwiftUI导航列表中展示?
嵌套数组过滤问题:SwiftUI中过滤Customer下的Staff数组
我有一个名为customerData的JSON文件,包含嵌套数组。目前已经完成第一层数组的过滤,但需要对第一层数组内部的嵌套数组(staff)进行过滤,数据流转路径为customerData.json → Customer.swift → ModelData.swift → Dashboard.swift。
1. customerData.json 数据
[ { "name":"Michael", "id": 101, "category": "Admin", "isFeatured": true, "staff":[ { "firstName": "Zeus", "lastName": "Lightening", "id": 106, "day": "Tuesday", "phoneNumber": "123-456-7890" }, { "firstName": "Poseidon", "lastName": "Sea", "id": 107, "day": "Sunday", "phoneNumber": "123-456-7890" } ] }, { "name":"Caleb", "id": 102, "category": "Tech", "isFeatured": true, "staff":[ { "firstName": "Hera", "lastName": "marriage", "id": 108, "day": "Monday", "phoneNumber": "123-456-7890" }, { "firstName": "Athena", "lastName": "Wisdoem", "id": 109, "day": "Sunday", "phoneNumber": "123-456-7890" } ] } ]
2. Customer.swift
import Foundation import SwiftUI import CoreLocation struct Customer: Hashable, Codable, Identifiable { var id: Int var name: String var staff: [Person] struct Person: Hashable, Codable, Identifiable { var day: String var firstName: String var lastName: String var id: Int var phoneNumber: String } }
3. ModelData.swift
import Foundation import Combine var customers: [Customer] = load("customerData.json") var person: [Customer.Person] = load("customerData.json")
4. Dashboard.swift(当前存在问题的视图代码)
import SwiftUI import Foundation struct Dashboard: View { @State var person = [Customer.Person]() var filterdRoutes:[Customer.Person]{ person.filter() { filteredCustomer in (filteredCustomer.day == "Tuesday") } } var filterdTech:[Customer]{ customers.filter { filteredCustomer in (filteredCustomer.name == "Michael") } } var body: some View { NavigationView { List{ ForEach(filterdTech) { department in Section(header: Text(department.name)){ ForEach(filterdRoutes) { filter1 in NavigationLink(destination: RouteDetail(person: filter1)) { RouteRow(person: filter1) } } } } } } } }
问题说明
当前已完成第一层数组的过滤(筛选出name为Michael的Customer),但嵌套的staff数组过滤逻辑无法正常工作,无法正确展示对应Customer下符合条件(day为Tuesday)的staff成员。
修正方案
问题根源
ModelData.swift中直接用load("customerData.json")初始化person数组错误,因为JSON根结构是[Customer],无法直接解析为[Customer.Person]。Dashboard.swift中filterdRoutes未关联当前遍历的department对象,而是基于空的@State var person数组过滤,自然得不到正确结果。
修正后的代码
1. 修正ModelData.swift
移除错误的person变量:
import Foundation import Combine var customers: [Customer] = load("customerData.json")
2. 修正Dashboard.swift的过滤逻辑
针对当前遍历的department对象,直接过滤其内部的staff数组:
import SwiftUI import Foundation struct Dashboard: View { var filterdTech: [Customer] { customers.filter { $0.name == "Michael" } } var body: some View { NavigationView { List { ForEach(filterdTech) { department in // 过滤当前Customer下符合条件的staff let filteredStaff = department.staff.filter { $0.day == "Tuesday" } Section(header: Text(department.name)) { ForEach(filteredStaff) { staff in NavigationLink(destination: RouteDetail(person: staff)) { RouteRow(person: staff) } } } } } .navigationTitle("Dashboard") } } }
修正说明
- 直接在遍历每个
department时过滤其自身的staff数组,确保只显示当前Customer下符合条件的员工。 - 移除无用的
@State var person变量,无需单独维护Person数组,直接从过滤后的Customer对象中获取数据即可。 - 简化闭包写法,用
$0替代命名参数,让代码更简洁。
内容的提问来源于stack exchange,提问作者Mang Mike
相关产品推荐
相关产品推荐

