如何折叠结构数组?

时间:2018-08-01 02:59:00

标签: swift

我有一个用于商品的结构:

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"

3 个答案:

答案 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

对于第二个问题,第一个结构的属性具有默认值,但第二个结构则没有。因此,第二个不提供空的构造函数。