go 2个多层嵌套的map取并集

使用递归取2个map并集,适用于写一个map去替换一个固定模版的map里的值(接口参数化替换等)
可能还存在bug。目前测试,见Test用例。

func MapSwitch(map01, map02 map[string]interface{}) map[string]interface{}{
    /**
     * @Description: 2个嵌套map取并集处理;map01:新的map数据,map02:待替换的map数据
                    PS:需保证map01和map02嵌套中的[]interface{}中对应下标的数据类型一致
     */
    for k, v := range map01{
        if _, ok := map02[k]; ok{
            switch v.(type) {
            case map[string]interface{}:
                MapSwitch(v.(map[string]interface{}), map02[k].(map[string]interface{}))
            case []interface{}:
                res := InterfaceSwitch(v.([]interface{}), map02[k].([]interface{}))
                map02[k] = res
            default:
                map02[k] = v
            }
        }else{
            map02[k] = v
        }
    }
    return map02
}

func InterfaceSwitch(interface01, interface02 []interface{})[]interface{}{
    /**
     * @Description: interface01:新的数据,interface02:待替换的数据
     */
    for k, v := range interface01{
        if k <= len(interface02) -1 {
            switch v.(type) {
            case map[string]interface{}:
                res := MapSwitch(v.(map[string]interface{}), interface02[k].(map[string]interface{}))
                newInterface = append(newInterface, res)
            case []interface{}:
                InterfaceSwitch(v.([]interface{}), interface02[k].([]interface{}))
            default:
                newInterface = append(newInterface, v)
            }
        }else{
            newInterface = append(newInterface, v)
        }
    }
    return newInterface
}

// Test
func TestQ01(t *testing.T){
    TTNEW := map[string]interface{}{
        "supplier": "Auto_test's Super Store NEW",
        "remark": "Create stock_adjustments Auto_test NEW",
        "items": []interface{}{
            map[string]interface{}{
                "sku_id": "1076802049474499",
                "quantity": 5,
                //"purchase_price": "999711",
                "items03":[]int{166, 266,366},
                "items04":map[string]interface{}{
                    "sku_id11": "10768020494744888",
                    "quantity": 88,
                    "purchase_price": "9997888",
                    "items03":[]int{155, 255,355},
                    "items04":[]int{1666, 2666,3666},
                },
            },
            map[string]interface{}{
                "sku_id": "1076802049474499NEW",
                "quantity": 1,
                //"purchase_price": "999711",
                "items33":[]int{166, 266,366},
                "items44":map[string]interface{}{
                    "sku_id11": "10768020494744888111",
                    "quantity": 88,
                    "purchase_price": "11111",
                    "items33":[]int{22, 22,22},
                    "items44":[]int{33, 33,33},
                },
            },
            []interface{}{
                map[string]interface{}{
                    "sku_id999":   "107680204947449999999",
                    "quantity999": 99999,
                    "quantity555": 5555,
                },
            },
        },
        //"adjust_stock_type": 2,
        "items02":[]int{111, 2222,333},
        "supplier02": "Auto_test's Super Store NEW02",
    }
    TT := map[string]interface{}{
        "adjust_stock_type": 1,
        "supplier": "Auto_test's Super Store",
        "remark": "Create stock_adjustments Auto_test",
        "items": []interface{}{
            map[string]interface{}{
                "sku_id": "10768020494744",
                "quantity": 1,
                "purchase_price": "9997",
                "items03":[]int{1, 2,3},
                "items04":map[string]interface{}{
                    "sku_id11": "10768020494744",
                    "quantity": 1,
                    "purchase_price": "9997",
                    "items03":[]int{1, 2,3},
                    "items04":[]int{1, 2,3},
                },
            },
            map[string]interface{}{
                "sku_id": "1076802049474499",
                "quantity": 3,
                //"purchase_price": "999711",
                "items33":[]int{1663, 2663,3663},
                "items44":map[string]interface{}{
                    "sku_id11": "107680204947448881113",
                    "quantity": 888,
                    "purchase_price": "11113",
                    "items33":[]int{222, 222,222},
                    "items44":[]int{333, 333,333},
                },
            },
            []interface{}{
                map[string]interface{}{
                    "sku_id999":   "107680204947449",
                    "quantity999": 22221,
                },
            },
        },
        "items02":[]int{1, 2,3},
    }
    res := MapSwitch(TTNEW, TT)
    resJson, _ := json.Marshal(res)
    fmt.Println("resJson:", string(resJson))
}

返回json

{
    "adjust_stock_type": 1,
    "items": [
        {
            "items03": [
                166,
                266,
                366
            ],
            "items04": {
                "items03": [
                    155,
                    255,
                    355
                ],
                "items04": [
                    1666,
                    2666,
                    3666
                ],
                "purchase_price": "9997888",
                "quantity": 88,
                "sku_id11": "10768020494744888"
            },
            "purchase_price": "9997",
            "quantity": 5,
            "sku_id": "1076802049474499"
        },
        {
            "items33": [
                166,
                266,
                366
            ],
            "items44": {
                "items33": [
                    22,
                    22,
                    22
                ],
                "items44": [
                    33,
                    33,
                    33
                ],
                "purchase_price": "11111",
                "quantity": 88,
                "sku_id11": "10768020494744888111"
            },
            "quantity": 1,
            "sku_id": "1076802049474499NEW"
        },
        {
            "quantity555": 5555,
            "quantity999": 99999,
            "sku_id999": "107680204947449999999"
        }
    ],
    "items02": [
        111,
        2222,
        333
    ],
    "remark": "Create stock_adjustments Auto_test NEW",
    "supplier": "Auto_test's Super Store NEW",
    "supplier02": "Auto_test's Super Store NEW02"
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容

  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,872评论 2 89
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,386评论 1 45
  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    伊森H阅读 3,040评论 0 15
  • Python语言特性 1 Python的函数参数传递 看两个如下例子,分析运行结果: 代码一: a = 1 def...
    时光清浅03阅读 464评论 0 0
  • 今天感恩节哎,感谢一直在我身边的亲朋好友。感恩相遇!感恩不离不弃。 中午开了第一次的党会,身份的转变要...
    迷月闪星情阅读 10,544评论 0 11