我正在尝试将多个数组的数组值与相同的键合并(按+组合排序)。 Go中是否有任何原生方式来转换此输入:
input = [
[
{ a: 1, b: [1,2]},
{ a: 2, b: [1,2]},
{ a: 3, b: [1,2]}
],
[
{ a: 1, b: [3,4]},
{ a: 2, b: [3,4]},
{ a: 3, b: [3,4]},
{ a: 4, b: [3,4]}
],
[
{ a:1, b: [5,6]},
{ a:2, b: [5,6]},
{ a:3, b: [5,6]},
{ a:4, b: [5,6]},
{ a:5, b: [5,6]}
]
]
成:
output = [
{ a: 1, b: [1,2,3,4,5,6]},
{ a: 2, b: [1,2,3,4,5,6]},
{ a: 3, b: [1,2,3,4,5,6]},
{ a: 4, b: [3,4, 5,6]},
{ a: 5, b: [5,6]},
]
答案 0 :(得分:9)
你的代码不是Go代码(它会以Ruby身份传递),而且没有明确的尝试来实际解决问题,这可能是你得到一些downvotes而没有答案的原因。
一种方法是将你的代码解释为Ruby,用input
一片切片的地图(字符串,也许,虽然Ruby会将它们视为符号)将其键入任意一个(在这种情况下) a
)或一些整数(在b
的情况下)。您可以使用空接口(interface{}
)对地图值执行此操作,但使用这样的结构会更直接:
type ab struct {
a int
b []int
}
并input
为[][]ab
。但只要我们重新调整您的数据以更好地适应语言,就可以更加直接地完全取消a
和b
,用a
的地图替换该结构值是键,b
值是值。事情就是迭代input
并将切片附加到output
的简单问题:
package main
import "fmt"
func main() {
input := []map[int][]int{
{
1: []int{1, 2},
2: []int{1, 2},
3: []int{1, 2},
},
{
1: []int{3, 4},
2: []int{3, 4},
3: []int{3, 4},
4: []int{3, 4},
},
{
1: []int{5, 6},
2: []int{5, 6},
3: []int{5, 6},
4: []int{5, 6},
5: []int{5, 6},
},
}
output := make(map[int][]int)
for _, m := range input {
for k, v := range m {
output[k] = append(output[k], v...)
}
}
fmt.Println(output)
}
这会产生输出:
map[1:[1 2 3 4 5 6] 2:[1 2 3 4 5 6] 3:[1 2 3 4 5 6] 4:[3 4 5 6] 5:[5 6]]
因此, output
可以根据需要组织数据,并提供表示数据组织的修改方式。