Сводная карта [ключ] разворот не возвращает правильное значение - PullRequest
0 голосов
/ 25 мая 2020

Расширение https://github.com/golang/go/issues/39242 ...

Я пытаюсь сгладить внутренний фрагмент, прикрепив внешний фрагмент, а затем отменить вывод выравнивания внешнего фрагмента, прикрепив внутренний фрагмент

https://play.golang.org/p/2tubtql5UwB

package main

import (
    "fmt"
)

func main() {
    inner := make([]interface{}, 0)
    inner = append(inner, map[string]interface{}{"id": "1"})
    inner = append(inner, map[string]interface{}{"id": "2"})
    inner = append(inner, map[string]interface{}{"id": "3"})

    outer := make([]interface{}, 0)
    outer = append(outer, map[string]interface{}{"id": "A", "inner": inner})
    fmt.Println(outer)

    // flatten inner slice into 1 level
    pivotInners := make([]interface{}, 0)
    for _, itemOuter := range outer {
        itemOuterMap := itemOuter.(map[string]interface{})
        innerSlice := itemOuterMap["inner"].([]interface{})
        delete(itemOuterMap, "inner")
        for _, itemInner := range innerSlice {
            itemInnerMap := itemInner.(map[string]interface{})
            itemInnerMap["outer"] = itemOuterMap
            pivotInners = append(pivotInners, itemInner)
        }
    }
    fmt.Println(pivotInners)

    // flatten outer slice to 1 level
    pivotOuters := make([]interface{}, 0)
    for _, pivotInner := range pivotInners {
        pivotInnerMap := pivotInner.(map[string]interface{})
        outerX := pivotInnerMap["outer"].(map[string]interface{})
        delete(pivotInnerMap, "outer")

        // dump row
        outerX["inner"] = pivotInnerMap
        fmt.Println(outerX)

        pivotOuters = append(pivotOuters, outerX)
    }

    // dump collection
    fmt.Println(pivotOuters)
}

Внутренние срезы

map[id:1]
map[id:2]
map[id:3]

Внешний срез

[map[id:A inner:[map[id:1] map[id:2] map[id:3]]]]

Внутренняя ось

[map[id:1 outer:map[id:A]] map[id:2 outer:map[id:A]] map[id:3 outer:map[id:A]]]

Ожидаю

Внешняя ось

[map[id:A inner:map[id:1]] map[id:A inner:map[id:2]] map[id:A inner:map[id:3]]]

но получил

Внешняя опорная точка

Если я повторю внутреннюю строку, она вернет правильное значение

map[id:A inner:map[id:1]]
map[id:A inner:map[id:2]]
map[id:A inner:map[id:3]]

, но после добавления slice получил только последнюю строку

[map[id:A inner:map[id:3]] map[id:A inner:map[id:3]] map[id:A inner:map[id:3]]]

Кто-нибудь знает?

1 Ответ

0 голосов
/ 25 мая 2020

Решение состоит в добавлении копии, чтобы каждая внутренняя карта не ссылалась на одну и ту же внешнюю карту.

https://play.golang.org/p/lwVuvTuwVVc

package main

import (
    "fmt"
)

func main() {
    inner := make([]interface{}, 0)
    inner = append(inner, map[string]interface{}{"id": "1"})
    inner = append(inner, map[string]interface{}{"id": "2"})
    inner = append(inner, map[string]interface{}{"id": "3"})

    outer := make([]interface{}, 0)
    outer = append(outer, map[string]interface{}{"id": "A", "inner": inner})
    fmt.Println(outer)

    // flatten inner slice into 1 level
    pivotInners := make([]interface{}, 0)
    for _, itemOuter := range outer {
        itemOuterMap := itemOuter.(map[string]interface{})
        innerSlice := itemOuterMap["inner"].([]interface{})
        delete(itemOuterMap, "inner")
        for _, itemInner := range innerSlice {
            itemInnerMap := itemInner.(map[string]interface{})
            outerCopy := make(map[string]interface{}, len(itemOuterMap))
            for k,v := range itemOuterMap {
                outerCopy[k] = v
            }
            itemInnerMap["outer"] = outerCopy
            pivotInners = append(pivotInners, itemInner)
        }
    }
    fmt.Println(pivotInners)

    // flatten outer slice to 1 level
    pivotOuters := make([]interface{}, 0)
    for _, pivotInner := range pivotInners {
        pivotInnerMap := pivotInner.(map[string]interface{})
        outerX := pivotInnerMap["outer"].(map[string]interface{})
        delete(pivotInnerMap, "outer")

        // dump row
        outerX["inner"] = pivotInnerMap
        fmt.Println(outerX)

        pivotOuters = append(pivotOuters, outerX)
    }

    // dump collection
    fmt.Println(pivotOuters)
}

Вывод

map[id:A inner:map[id:1]]
map[id:A inner:map[id:2]]
map[id:A inner:map[id:3]]
[map[id:A inner:map[id:1]] map[id:A inner:map[id:2]] map[id:A inner:map[id:3]]]

Спасибо https://github.com/200sc за ответ на вопрос о резерве!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...