如果 bool key 为 false,则消除整行
Eliminate the entire row if bool key is false
我有以下回复
"timeslots" : [
{
"date" : "2019-09-10",
"slots" : [
{
"end" : "10:30:00",
"available" : false,
"start" : "09:00:00",
"timeslot_pk" : 78
},
{
"end" : "13:00:00",
"available" : false,
"start" : "11:00:00",
"timeslot_pk" : 79
},
{
"end" : "16:00:00",
"available" : false,
"start" : "14:00:00",
"timeslot_pk" : 80
},
{
"end" : "18:30:00",
"available" : true,
"start" : "16:30:00",
"timeslot_pk" : 81
},
{
"end" : "21:00:00",
"available" : true,
"start" : "19:00:00",
"timeslot_pk" : 82
}
],
我想删除包含 "available" 的槽值:false 并加载仅包含可用的 tableview 单元格:true
以下是API调用
if let slotArray = json["timeslots"][self.dayIndex ?? 0]["slots"].array{
if !slotArray.isEmpty || slotArray != [] {
for slotJSON in slotArray {
let slot = Slots.parseSlots(slotJSON: slotJSON)
self.slots.append(slot)
self.tableView.reloadData()
}
}
else {
self.view.makeToast("No Slots Found!", duration: 3.0, position: .bottom)
}
在 self.slots
上使用 filter(_:)
得到所有 slots
其中 available = true
,
for slotJSON in slotArray {
let slot = Slots.parseSlots(slotJSON: slotJSON)
self.slots.append(slot)
}
self.slots = self.slots.filter({ [=10=].available })
self.tableView.reloadData()
仅在解析和过滤所有 slots
后才重新加载 tableView
。在每次 slot
解析后重新加载 tableView
将导致不必要的开销。
尝试
struct Root: Codable {
let end: String
let available: Bool
let start: String
let timeslotPk: Int
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let value = json["timeslots"][self.dayIndex ?? 0]["slots"]
let data = try! value.rawData()
let res = try! decoder.decode([Root].self, from:data)
let filtered = res.filter { [=10=].available }
print(filtered)
在创建 Slots
个实例之前过滤数组
if let slotArray = json["timeslots"][self.dayIndex ?? 0]["slots"].array {
let filteredSlots = slotArray.filter{[=10=]["available"].bool == true }
self.slots = filteredSlots.map { Slots.parseSlots(slotJSON: [=10=]) }
self.tableView.reloadData()
} else {
self.view.makeToast("No Slots Found!", duration: 3.0, position: .bottom)
}
考虑放弃 SwiftyJSON
以支持 Codable
。
我有以下回复
"timeslots" : [
{
"date" : "2019-09-10",
"slots" : [
{
"end" : "10:30:00",
"available" : false,
"start" : "09:00:00",
"timeslot_pk" : 78
},
{
"end" : "13:00:00",
"available" : false,
"start" : "11:00:00",
"timeslot_pk" : 79
},
{
"end" : "16:00:00",
"available" : false,
"start" : "14:00:00",
"timeslot_pk" : 80
},
{
"end" : "18:30:00",
"available" : true,
"start" : "16:30:00",
"timeslot_pk" : 81
},
{
"end" : "21:00:00",
"available" : true,
"start" : "19:00:00",
"timeslot_pk" : 82
}
],
我想删除包含 "available" 的槽值:false 并加载仅包含可用的 tableview 单元格:true
以下是API调用
if let slotArray = json["timeslots"][self.dayIndex ?? 0]["slots"].array{
if !slotArray.isEmpty || slotArray != [] {
for slotJSON in slotArray {
let slot = Slots.parseSlots(slotJSON: slotJSON)
self.slots.append(slot)
self.tableView.reloadData()
}
}
else {
self.view.makeToast("No Slots Found!", duration: 3.0, position: .bottom)
}
在 self.slots
上使用 filter(_:)
得到所有 slots
其中 available = true
,
for slotJSON in slotArray {
let slot = Slots.parseSlots(slotJSON: slotJSON)
self.slots.append(slot)
}
self.slots = self.slots.filter({ [=10=].available })
self.tableView.reloadData()
仅在解析和过滤所有 slots
后才重新加载 tableView
。在每次 slot
解析后重新加载 tableView
将导致不必要的开销。
尝试
struct Root: Codable {
let end: String
let available: Bool
let start: String
let timeslotPk: Int
}
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let value = json["timeslots"][self.dayIndex ?? 0]["slots"]
let data = try! value.rawData()
let res = try! decoder.decode([Root].self, from:data)
let filtered = res.filter { [=10=].available }
print(filtered)
在创建 Slots
个实例之前过滤数组
if let slotArray = json["timeslots"][self.dayIndex ?? 0]["slots"].array {
let filteredSlots = slotArray.filter{[=10=]["available"].bool == true }
self.slots = filteredSlots.map { Slots.parseSlots(slotJSON: [=10=]) }
self.tableView.reloadData()
} else {
self.view.makeToast("No Slots Found!", duration: 3.0, position: .bottom)
}
考虑放弃 SwiftyJSON
以支持 Codable
。