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

如何过滤嵌套数组并在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成员。


修正方案

问题根源

  1. ModelData.swift中直接用load("customerData.json")初始化person数组错误,因为JSON根结构是[Customer],无法直接解析为[Customer.Person]。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:00:50