在golang中循环遍历数组对象和分组的最佳方法

时间:2018-07-26 16:00:34

标签: arrays go

我有一个图书清单(BookId),每本书都与一个图书收藏集(CollectionId)相关联。

我正在尝试找出按“收藏”对结果进行分组的最佳方法,因此所有属于该收藏的书籍都在其下列出,我可以通过以下方式构建结果:

书籍A,D,G属于集合1。 图书B,C,E属于馆藏2。

我将这些书放在列表/数组中,需要循环浏览并查找它们所属的collectionID,并且它们需要存储新列表,如下所示:

CollectionID 1:

- Book A, Book D, Book G

CollectionID 2:

- Book B, Book C, Book E

CollectionID 3:

- Book F

3 个答案:

答案 0 :(得分:3)

首先,您设计数据库。例如,

package main

type CollectionId string

type Collection struct {
    Id   CollectionId
    Name string
}

type BookId string

type Book struct {
    Id         BookId
    Name       string
    Collection CollectionId
}

type Books map[BookId]Book

type Collections map[CollectionId][]BookId

func main() {}

答案 1 :(得分:1)

您可以使用地图为每个馆藏ID存储一堆书。

type Book struct {
    Title        string
    Author       string
    CollectionID int
}

func main() {
    books := GetBooks()
    collections := make(map[int][]Book)
    for _, b := range books {
        collections[b.CollectionID] = append(collections[b.CollectionID], b)
    }
    ...
}

答案 2 :(得分:0)

Golang确实缺少一些帮助程序功能(例如Php array_map或Java stream),他们想使它尽可能简单。

有一个https://github.com/thoas/go-funk库,提供“现代助手(地图,查找,包含,过滤器,...)”,在您的情况下,您可能会对以下方面感兴趣:

ToMap

  

基于枢轴字段将结构片段转换为地图。

f := &Foo{
    ID:        1,
    FirstName: "Gilles",
    LastName:  "Fabio",
    Age:       70,
}

b := &Foo{
    ID:        2,
    FirstName: "Florent",
    LastName:  "Messa",
    Age:       80,
}

results := []*Foo{f, b}

mapping := funk.ToMap(results, "ID") // map[int]*Foo{1: f, 2: b}