我有一个用于商品的结构:
struct item: Decodable {
var category_id: Int
var name: String
}
我通过JSONDecoder().decode into an array (items: [item])
收到。
我想将其折叠成这样的结构:
struct collapsed{
var category_id = Int()
var items = [String]()
}
以便我可以更方便地遍历它。我该怎么办?
所以我有这个变量:
items: [item]
看起来像这样:
items
[0]
-category_id: 0
-name: "item1"
[1]
-category_id: 1
-name: "item2"
[2]
-category_id: 0
-name: "item3"
[3]
-category_id: 1
-name: "item4"
[4]
-category_id: 0
-name: "item5"
我想将其折叠为此:
collapseditems: [collapsed]
应该看起来像这样:
collapseditems
[0]
-category_id: 0
-items:
[0]: "item1"
[1]: "item3"
[2]: "item5"
[1]
-category_id: 1
-items:
[0]: "item2"
[1]: "item4"
答案 0 :(得分:2)
第一件事-结构名称应以大写字母开头。
有几种方法可以将Item
数组转换为Collapsed
数组。这是一种首先将Item
的数组分组为以category_id
为键的字典的方法。然后,将该字典映射到Collapsed
的数组中。最后,该数组按category_id
排序。
struct Item: Decodable {
var category_id: Int
var name: String
}
struct Collapsed {
let category_id: Int
var items: [String]
}
// Your array of Item - here is some test data
let items: [Item] = [
Item(category_id: 0, name: "item1"),
Item(category_id: 1, name: "item2"),
Item(category_id: 0, name: "item3"),
Item(category_id: 1, name: "item4"),
Item(category_id: 0, name: "item5")
]
// Create a dictionary where the keys are category_id and the values are an array of Item with the same category_id
let mapping = Dictionary(grouping: items, by: { $0.category_id })
// Map that dictionary into an array of Sorted and then sort that array by category_id
let collapsedItems: [Collapsed] = mapping
.map { Collapsed(category_id: $0.key, items: $0.value.map { $0.name }) }
.sorted { $0.category_id < $1.category_id }
答案 1 :(得分:1)
您可以通过使用以下代码来实现。
var sortedList: [sorted] = []
for i in item {
if let index = sortedList.index(where: { $0.category_id == i.category_id }) {
sortedList[index].items.append(i.name)
} else {
sortedList.append(sorted(category_id: i.category_id, items: [i.name]))
}
}
print(sortedList)
答案 2 :(得分:0)
对于第一个问题,您要列出item
结构的排序列表吗?
如果是,则可以这样使用sorted
的{{1}}方法。
Array
对于第二个问题,第一个结构的属性具有默认值,但第二个结构则没有。因此,第二个不提供空的构造函数。