arrays - 如何基于参数对对象列表进行分类

标签 arrays dictionary go categories slice

我有一个具有此定义的对象列表:

type MyObject struct {
    ID        int `json:"id"`
    Level     int `json:"level"`
    CityID    int `json:"city_id"`
}

我想根据CityID对它们进行分类,以获得列表列表,其中每个内部列表的项目都具有相同的CityID

例如,如果我有以下列表:
[
    MyObject {ID: 1, Level: 12, CityID: 7},
    MyObject {ID: 2, Level: 15, CityID: 2},
    MyObject {ID: 3, Level: 55, CityID: 4},
    MyObject {ID: 4, Level: 88, CityID: 7},
    MyObject {ID: 5, Level: 11, CityID: 4},
    MyObject {ID: 6, Level: 5, CityID: 7},
    MyObject {ID: 7, Level: 42, CityID: 2}
]

我需要下面的输出:
[
    [MyObject {ID: 1, Level: 12, CityID: 7}, MyObject {ID: 4, Level: 88, CityID: 7}, MyObject {ID: 6, Level: 5, CityID: 7}],
    [MyObject {ID: 2, Level: 15, CityID: 2}, MyObject {ID: 7, Level: 42, CityID: 2}],
    [MyObject {ID: 3, Level: 55, CityID: 4}, MyObject {ID: 5, Level: 11, CityID: 4}]
]

我知道使用itertools在python中是可能的,但我是go的新手,对它的库知之甚少。有什么帮助吗?

编辑1:

我目前正在使用此:
m := make(map[int][]MyObject)

for _, item := range myList {
    if val, ok := m[item.CityID]; ok {
        m[item.CityID] = append(val, item)
    } else {
        m[item.CityID] = []MyObject{item, }
    }
}

最佳答案

您当前的方法是要走的路,但可以简化,无需检查 map 中是否已存在CityID,因为indexing带有未在其中的键的 map 将导致 map 中的zero value值类型,即 slice 的nil,您可以毫无问题地附加到nil slice :

m := make(map[int][]MyObject)

for _, item := range myList {
    m[item.CityID] = append(m[item.CityID], item)
}

关于arrays - 如何基于参数对对象列表进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59734153/

相关文章:

php - 如何从数组中获取唯一值?

iphone - 我们如何知道 map 坐标是否在当前区域?

android - 办公 map 如室内地图

curl - 如何使用golang代码上传文件

parsing - Golang 使用预定义的结构和动态值解析 YAML

c - 请帮助纠正此错误 : reading integers line by line from a file using fscanf in c

php - 使用 PHP 将大型递归函数保持在最低限度

C# 字典到 C++ std::map

types - 由类型文字定义的类型的结构字段上的方法

java - 如何在 C++ 中最有效地将像素数组渲染到窗口?