首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用数据编织从三/四个json数组列表生成所有可能的组合

使用数据编织从三/四个json数组列表生成所有可能的组合
EN

Stack Overflow用户
提问于 2021-10-08 04:41:06
回答 2查看 124关注 0票数 0

我在修骡子。在工作时,我遇到了一个场景,其中我想从传入的JSON数组列表(3-4个数组对象)中生成所有可能的值组合。JSON数组列表下的值是动态的。

我想以JSON格式生成输出。我只想用数据编织来实现这一点。请帮助我如何在骡子4中使用datawevae实现这一点。

下面是我的JSON输入和必需的JSON输出。

注意: Json数组列表是动态的。

输入JSON数组:

代码语言:javascript
复制
    {
  "airlines": [
    {
      "airlineId": "0520k",
      "airlineName": "Kingfisher",
      "airwayCost": 700
    },
    {
      "airlineId": "0620i",
      "airlineName": "indigo",
      "airwayCost": 600
    }
  ],
  "hotels": [
    {
      "hotelId": "tj23a",
      "hotelName": "Taj",
      "hotelCost": 600
    },
    {
      "hotelId": "f",
      "hotelName": "fdg",
      "hotelCost": 600
    }
  ],
  "cabs": [
    {
      "cabId": "ola2312",
      "cabName": "Ola",
      "Cost": "600"
    }
  ]
}

输出:

代码语言:javascript
复制
    {
  "itenary 1": {
    "hotelDetails": {
      "hotelId": "tj23a",
      "hotelName": "Taj",
      "hotelCost": 6000
    },
    "airlines": {
      "airlineId": "0520k",
      "airlineName": "Kingfisher",
      "airwayCost": 1700
    },"cabs":
        {
        "cabId": "ola2312",
        "cabName":"Ola",
        "Cost":"600"    
    },
    "TripPackage" : 8300
  },
  "itenary 2": {
    "hotelDetails": {
      "hotelId": "Mnva",
      "hotelName": "Minvera",
      "hotelCost": 1600
    },
    "airlines": {
      "airlineId": "0520k",
      "airlineName": "Kingfisher",
      "airwayCost": 1700
    },
    "cabs":
        {
        "cabId": "ola2312",
        "cabName":"Ola",
        "Cost":"600"    
    },
    "TripPackage" : 3900
  },
  "itenary 3": {
    "hotelDetails": {
      "hotelId": "tj23a",
      "hotelName": "Taj",
      "hotelCost": 6000
    },
    "airlines": {
      "airlineId": "0620i",
      "airlineName": "indigo",
      "airwayCost": 1600
    },
    "cabs":
        {
        "cabId": "ola2312",
        "cabName":"Ola",
        "Cost":"600"    
    },
    "TripPackage" : 8200
  },
  "itenary 4": {
    "hotelDetails": {
      "hotelId": "Mnva",
      "hotelName": "Minvera",
      "hotelCost": 1600
    },
    "airlines": {
      "airlineId": "0620i",
      "airlineName": "indigo",
      "airwayCost": 1600
    },
    "cabs":
        {
        "cabId": "ola2312",
        "cabName":"Ola",
        "Cost":"600"    
    },
    "TripPackage" : 3800
  }
}

我可以编写数据编织代码的2个数组对象使用扁平和地图,但更多的没有数组对象组合。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-10-08 06:41:35

试着用这种方法。

输入

代码语言:javascript
复制
{
  "airlines": [
    {
      "airlineId": "0520k",
      "airlineName": "Kingfisher",
      "airwayCost": 700
    },
    {
      "airlineId": "0620i",
      "airlineName": "indigo",
      "airwayCost": 600
    },
    {
      "airlineId": "0720i",
      "airlineName": "Emirates",
      "airwayCost": 1600
    }

  ],
  "hotels": [
    {
      "hotelId": "tj23a",
      "hotelName": "Taj",
      "hotelCost": 600
    },
    {
      "hotelId": "f",
      "hotelName": "fdg",
      "hotelCost": 600
    },
     {
      "hotelId": "g",
      "hotelName": "fasddg",
      "hotelCost": 650
    }

  ],
  "cabs": [
    {
      "cabId": "ola2312",
      "cabName": "Ola",
      "Cost": "600"
    },
     {
      "cabId": "uber22",
      "cabName": "Uber",
      "Cost": "1000"
    }
  ]
}

脚本

代码语言:javascript
复制
%dw 2.0
output application/json
var totalCombinations = sizeOf(payload.airlines) * sizeOf(payload.hotels) * sizeOf(payload.cabs)
---
{(1 to totalCombinations map   {
    "itenary $($$+1)" : 
             hotelDetails:  if (($$) > sizeOf(payload.hotels) -1) payload.hotels[($$) mod sizeOf(payload.hotels)]  else payload.hotels[($$)] ,
             airlineDetails: if (($$) > sizeOf(payload.airlines) -1) payload.airlines[($$) mod sizeOf(payload.airlines)]  else payload.airlines[($$)],
             cabDetails : if (($$) > sizeOf(payload.cabs) -1) payload.cabs[($$) mod sizeOf(payload.cabs)]  else payload.cabs[($$)],
            TripPackage: ((if (($$) > sizeOf(payload.hotels) -1) payload.hotels[($$) mod sizeOf(payload.hotels)].hotelCost as Number  else payload.hotels[($$)].hotelCost as Number) + (if (($$) > sizeOf(payload.airlines) -1) payload.airlines[($$) mod sizeOf(payload.airlines)].airwayCost as Number  else payload.airlines[($$)].airwayCost as Number) + if (($$) > sizeOf(payload.cabs) -1) payload.cabs[($$) mod sizeOf(payload.cabs)].Cost as Number  else payload.cabs[($$)].Cost as Number)
})}

输出

代码语言:javascript
复制
[
  {
    "itenary 1": {
      "hotelDetails": {
        "hotelId": "tj23a",
        "hotelName": "Taj",
        "hotelCost": 600
      }
    },
    "airlineDetails": {
      "airlineId": "0520k",
      "airlineName": "Kingfisher",
      "airwayCost": 700
    },
    "cabDetails": {
      "cabId": "ola2312",
      "cabName": "Ola",
      "Cost": "600"
    },
    "TripPackage": 1900
  },
  {
    "itenary 2": {
      "hotelDetails": {
        "hotelId": "f",
        "hotelName": "fdg",
        "hotelCost": 600
      }
    },
    "airlineDetails": {
      "airlineId": "0620i",
      "airlineName": "indigo",
      "airwayCost": 600
    },
    "cabDetails": {
      "cabId": "uber22",
      "cabName": "Uber",
      "Cost": "1000"
    },
    "TripPackage": 2200
  },
  {
    "itenary 3": {
      "hotelDetails": {
        "hotelId": "g",
        "hotelName": "fasddg",
        "hotelCost": 650
      }
    },
    "airlineDetails": {
      "airlineId": "0720i",
      "airlineName": "Emirates",
      "airwayCost": 1600
    },
    "cabDetails": {
      "cabId": "ola2312",
      "cabName": "Ola",
      "Cost": "600"
    },
    "TripPackage": 2850
  },
  {
    "itenary 4": {
      "hotelDetails": {
        "hotelId": "tj23a",
        "hotelName": "Taj",
        "hotelCost": 600
      }
    },
    "airlineDetails": {
      "airlineId": "0520k",
      "airlineName": "Kingfisher",
      "airwayCost": 700
    },
    "cabDetails": {
      "cabId": "uber22",
      "cabName": "Uber",
      "Cost": "1000"
    },
    "TripPackage": 2300
  },
  {
    "itenary 5": {
      "hotelDetails": {
        "hotelId": "f",
        "hotelName": "fdg",
        "hotelCost": 600
      }
    },
    "airlineDetails": {
      "airlineId": "0620i",
      "airlineName": "indigo",
      "airwayCost": 600
    },
    "cabDetails": {
      "cabId": "ola2312",
      "cabName": "Ola",
      "Cost": "600"
    },
    "TripPackage": 1800
  },
  {
    "itenary 6": {
      "hotelDetails": {
        "hotelId": "g",
        "hotelName": "fasddg",
        "hotelCost": 650
      }
    },
    "airlineDetails": {
      "airlineId": "0720i",
      "airlineName": "Emirates",
      "airwayCost": 1600
    },
    "cabDetails": {
      "cabId": "uber22",
      "cabName": "Uber",
      "Cost": "1000"
    },
    "TripPackage": 3250
  },
  {
    "itenary 7": {
      "hotelDetails": {
        "hotelId": "tj23a",
        "hotelName": "Taj",
        "hotelCost": 600
      }
    },
    "airlineDetails": {
      "airlineId": "0520k",
      "airlineName": "Kingfisher",
      "airwayCost": 700
    },
    "cabDetails": {
      "cabId": "ola2312",
      "cabName": "Ola",
      "Cost": "600"
    },
    "TripPackage": 1900
  },
  {
    "itenary 8": {
      "hotelDetails": {
        "hotelId": "f",
        "hotelName": "fdg",
        "hotelCost": 600
      }
    },
    "airlineDetails": {
      "airlineId": "0620i",
      "airlineName": "indigo",
      "airwayCost": 600
    },
    "cabDetails": {
      "cabId": "uber22",
      "cabName": "Uber",
      "Cost": "1000"
    },
    "TripPackage": 2200
  },
  {
    "itenary 9": {
      "hotelDetails": {
        "hotelId": "g",
        "hotelName": "fasddg",
        "hotelCost": 650
      }
    },
    "airlineDetails": {
      "airlineId": "0720i",
      "airlineName": "Emirates",
      "airwayCost": 1600
    },
    "cabDetails": {
      "cabId": "ola2312",
      "cabName": "Ola",
      "Cost": "600"
    },
    "TripPackage": 2850
  },
  {
    "itenary 10": {
      "hotelDetails": {
        "hotelId": "tj23a",
        "hotelName": "Taj",
        "hotelCost": 600
      }
    },
    "airlineDetails": {
      "airlineId": "0520k",
      "airlineName": "Kingfisher",
      "airwayCost": 700
    },
    "cabDetails": {
      "cabId": "uber22",
      "cabName": "Uber",
      "Cost": "1000"
    },
    "TripPackage": 2300
  },
  {
    "itenary 11": {
      "hotelDetails": {
        "hotelId": "f",
        "hotelName": "fdg",
        "hotelCost": 600
      }
    },
    "airlineDetails": {
      "airlineId": "0620i",
      "airlineName": "indigo",
      "airwayCost": 600
    },
    "cabDetails": {
      "cabId": "ola2312",
      "cabName": "Ola",
      "Cost": "600"
    },
    "TripPackage": 1800
  },
  {
    "itenary 12": {
      "hotelDetails": {
        "hotelId": "g",
        "hotelName": "fasddg",
        "hotelCost": 650
      }
    },
    "airlineDetails": {
      "airlineId": "0720i",
      "airlineName": "Emirates",
      "airwayCost": 1600
    },
    "cabDetails": {
      "cabId": "uber22",
      "cabName": "Uber",
      "Cost": "1000"
    },
    "TripPackage": 3250
  },
  {
    "itenary 13": {
      "hotelDetails": {
        "hotelId": "tj23a",
        "hotelName": "Taj",
        "hotelCost": 600
      }
    },
    "airlineDetails": {
      "airlineId": "0520k",
      "airlineName": "Kingfisher",
      "airwayCost": 700
    },
    "cabDetails": {
      "cabId": "ola2312",
      "cabName": "Ola",
      "Cost": "600"
    },
    "TripPackage": 1900
  },
  {
    "itenary 14": {
      "hotelDetails": {
        "hotelId": "f",
        "hotelName": "fdg",
        "hotelCost": 600
      }
    },
    "airlineDetails": {
      "airlineId": "0620i",
      "airlineName": "indigo",
      "airwayCost": 600
    },
    "cabDetails": {
      "cabId": "uber22",
      "cabName": "Uber",
      "Cost": "1000"
    },
    "TripPackage": 2200
  },
  {
    "itenary 15": {
      "hotelDetails": {
        "hotelId": "g",
        "hotelName": "fasddg",
        "hotelCost": 650
      }
    },
    "airlineDetails": {
      "airlineId": "0720i",
      "airlineName": "Emirates",
      "airwayCost": 1600
    },
    "cabDetails": {
      "cabId": "ola2312",
      "cabName": "Ola",
      "Cost": "600"
    },
    "TripPackage": 2850
  },
  {
    "itenary 16": {
      "hotelDetails": {
        "hotelId": "tj23a",
        "hotelName": "Taj",
        "hotelCost": 600
      }
    },
    "airlineDetails": {
      "airlineId": "0520k",
      "airlineName": "Kingfisher",
      "airwayCost": 700
    },
    "cabDetails": {
      "cabId": "uber22",
      "cabName": "Uber",
      "Cost": "1000"
    },
    "TripPackage": 2300
  },
  {
    "itenary 17": {
      "hotelDetails": {
        "hotelId": "f",
        "hotelName": "fdg",
        "hotelCost": 600
      }
    },
    "airlineDetails": {
      "airlineId": "0620i",
      "airlineName": "indigo",
      "airwayCost": 600
    },
    "cabDetails": {
      "cabId": "ola2312",
      "cabName": "Ola",
      "Cost": "600"
    },
    "TripPackage": 1800
  },
  {
    "itenary 18": {
      "hotelDetails": {
        "hotelId": "g",
        "hotelName": "fasddg",
        "hotelCost": 650
      }
    },
    "airlineDetails": {
      "airlineId": "0720i",
      "airlineName": "Emirates",
      "airwayCost": 1600
    },
    "cabDetails": {
      "cabId": "uber22",
      "cabName": "Uber",
      "Cost": "1000"
    },
    "TripPackage": 3250
  }
]
票数 1
EN

Stack Overflow用户

发布于 2021-10-08 19:06:35

我很确定Salim的答案更有表现力,但这是地图和扁平的解决方案,以防对任何人有用。

代码语言:javascript
复制
    %dw 2.0
    output application/json
    var hotelCount = sizeOf(payload.hotels)
    var cabCount = sizeOf(payload.cabs)
    fun itineraryNum(ia, ih, ic) = ia * hotelCount * cabCount + ih * cabCount + ic + 1
    
    ---
    flatten(flatten(
        payload.airlines map ((a, ia) -> 
            payload.hotels map ((h, ih ) -> 
                payload.cabs map ((c, ic) -> {
                    ("itinerary " ++ itineraryNum(ia, ih, ic) as String): {
                        hotelDetails: {
                            hotelId: h.hotelId,
                            hotelName: h.hotelName,
                            hotelCost: h.hotelCost
                        },
                        airlineDetails: {
                            airlineId: a.airlineId,
                            airlineName: a.airlineName,
                            airwayCost: a.airwayCost 
                        },
                        cabs: {
                            cabId: c.cabId,
                            cabName: c.cabName,
                            Cost: c.Cost
                        },
                        TripPackage: h.hotelCost + a.airwayCost + c.Cost
                    }
                }) 
            )
        )
    ))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69490584

复制
相关文章

相似问题

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