首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mule4数据组织变换

Mule4数据组织变换
EN

Stack Overflow用户
提问于 2022-11-17 15:46:02
回答 1查看 37关注 0票数 -1

我需要转换下面的JSON

投入:-

代码语言:javascript
复制
{
    "type": "donut",
    "weight-unit": "lb",
    "price-unit": "$/lb",
    "price": 10.75,
    "batters":
        {
            "batter":
                [
                    { "id": "10011", "type": "Original","weight": 500},
                    { "id": "10021", "type": "Chocolate","weight": 200, "price": 11.75 },
                    { "id": "10031", "type": "Blueberry", "weight": 250, "price": 11.75  },
                    { "id": "10041", "type": "Devil's Food", "weight": 150}
                ]
        },
    "topping":
        [
            { "id": "50011", "type": "None", "price": 0 },
            { "id": "50021", "type": "Glazed", "price": 45.23},
            { "id": "50051", "type": "Sugar", "price": 34.1},
            { "id": "50071", "type": "Powdered Sugar", "price": 21.11},
            { "id": "50061", "type": "Chocolate with Sprinkles", "price": 34.43 },
            { "id": "50031", "type": "Chocolate", "price": 87.40},
            { "id": "50041", "type": "Maple", "price": 64.11}
        ]
}

我想要的输出是

产出:-

代码语言:javascript
复制
{
    "type": "donut",
    "ChocolateFlavoredGlazedDonut" : {
        "weight": 200,
        "unit": "kg",
        "price": 56.98,
        "unit": "$/kg",
    },
    "ChocolateFlavoredSprinklesDonut" : {
        "weight": 200,
        "unit": "kg",
        "price": 46.18,
        "unit": "$/kg",
    },
    "BlueberryFlavoredSugarDonut" : {
        "weight": 250,
        "unit": "kg",
        "price": 45.85,
        "unit": "$/kg",
    },
    "OriginalGlazedDonut" : {
        "weight": 500,
        "unit": "kg",
        "price": 45.23,
        "unit": "$/kg",
    },
        "OriginalMapleDonut" : {
        "weight": 500,
        "unit": "kg",
        "price": 64.11,
        "unit": "$/kg",
    },
        "OriginalSugarDonut" : {
        "weight": 500,
        "unit": "kg",
        "price": 34.1,
        "unit": "$/kg",
    },
}

计划书:-

"BatterName + ToppingName“:{”重量“:500(面糊重量),”单位“:”公斤“(硬编码),”价格“:34.1(面糊价格+最高价格),”单位“:”$/kg“(硬编码,})

例如,如果面糊名为“巧克力”,那么每个面糊将有6个配料。所以总击球数是4,打顶数是8,我想要32项在最后的输出。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-17 16:54:41

你基本上需要在配料和击球手上进行交叉连接。您可以使用来自dw::core::Arraysdw::core::Arrays来实现这一点。它接受两个数组作为输入以及两个连接条件(这是内联函数)。为此,您只需传递一个始终返回true (或任何其他静态值,但在两个条件函数中应该是相同的)的函数,因此该函数将将每个项与每个项合并,并获得所有可能的组合。

我注意到,组合后的小吃的名字不是很直接,所以我为它设置了一个分开的函数。

代码语言:javascript
复制
%dw 2.0
import join from dw::core::Arrays
import capitalize from dw::core::Strings
output application/json

fun getComboName(batterName, toppingName, snackType) = 
    capitalize(batterName) 
    ++ (if(lower(batterName) != "original")("Flavoured") else "")
    ++ (if(lower(toppingName) != "none") capitalize((toppingName splitBy " ")[-1]) else "")
    ++ capitalize(snackType) 
---
join(
    payload.batters.batter,
    payload.topping,
    (a) -> true,
    (a) -> true
)
reduce ((combo, acc={"type": payload."type"}) -> {
    (acc),
    (getComboName(combo.l."type", combo.r."type", payload."type")): {
        weight: combo.l.weight,
        unit: "kg",
        price: (combo.l.price default 0) + (combo.r.price default 0),
        unit: "\$/kg"
    }
})
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74478297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档