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

如何过滤SwiftyJSON数组?已尝试Stack Overflow方案仍未解决

解决JSON数组过滤并刷新TableView的问题

我来帮你搞定这个过滤数组并刷新TableView的问题~首先得说,你现在用[Any]类型的数组操作起来太麻烦,还容易出错,咱们先把它转成更安全的类型,再做过滤会顺畅很多,结合你用SwiftyJSON的情况,给你两种方案:

第一步:把[Any]转成易操作的类型

方案1:转成[[String: Any]]数组

替换你原来的数组定义,直接从SwiftyJSON转成字典数组:

var arrClientType: [[String: Any]] = []
self.json = JSON(value)
self.arrClientType = self.json["client_type_data"].arrayObject as? [[String: Any]] ?? []

方案2:自定义模型(更规范推荐)

先定义一个和JSON结构匹配的模型:

struct ClientType: Codable {
    let clientTypeName: String
    let clientTypeId: Int
    
    // 对应JSON里的蛇形键名
    enum CodingKeys: String, CodingKey {
        case clientTypeName = "client_type_name"
        case clientTypeId = "client_type_id"
    }
}

然后把SwiftyJSON的数据转成模型数组:

var arrClientType: [ClientType] = []
self.json = JSON(value)
if let rawData = try? self.json["client_type_data"].rawData() {
    arrClientType = try? JSONDecoder().decode([ClientType].self, from: rawData) ?? []
}

第二步:实现过滤逻辑

根据你的需求,比如过滤特定ID或者包含关键词的名称,举两个常用例子:

如果用[[String: Any]]数组

// 示例1:过滤client_type_id等于5的元素
let filteredArray = arrClientType.filter { item in
    guard let id = item["client_type_id"] as? Int else { return false }
    return id == 5
}

// 示例2:过滤名称包含"Broker"的元素
let keyword = "Broker"
let filteredArray = arrClientType.filter { item in
    guard let name = item["client_type_name"] as? String else { return false }
    return name.contains(keyword)
}

如果用自定义模型数组

代码会更简洁安全:

// 示例1:过滤ID为5的元素
let filteredArray = arrClientType.filter { $0.clientTypeId == 5 }

// 示例2:过滤名称包含"Broker"的元素
let keyword = "Broker"
let filteredArray = arrClientType.filter { $0.clientTypeName.contains(keyword) }

第三步:刷新TableView

过滤完成后,把结果赋值给TableView的数据源数组,然后在主线程刷新UI(UI操作必须在主线程哦):

// 假设你有个专门存过滤后数据的数组,比如filteredClientTypes
self.filteredClientTypes = filteredArray
// 主线程刷新TableView
DispatchQueue.main.async {
    self.tableView.reloadData()
}

如果实在要坚持用[Any]数组过滤(不推荐,容易崩溃),可以这样写:

let filteredArray = arrClientType.filter { item in
    guard let clientDict = item as? [String: Any],
          let id = clientDict["client_type_id"] as? Int else {
        return false
    }
    return id == 1 // 这里替换成你的过滤条件
}

内容的提问来源于stack exchange,提问作者riddhi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:25:12