如何使用jq生成输入JSON中存在的两个数组的笛卡尔积

时间:2017-07-28 21:41:45

标签: arrays json jq cartesian-product

我希望能够使用 { "quantities": [ { "product": "A", "quantity": 30 }, { "product": "B", "quantity": 10 } ], "portions": [ { "customer": "C1", "percentage": .6 }, { "customer": "C2", "percentage": .4 } ] } 输出'产品'输入JSON中的2个数组...例如,给定以下输入JSON:

[
    {
     "customer": "C1",
     "quantities": [
         {
             "product": "A",
             "quantity": 18
         },
         {
             "product": "B",
             "quantity": 6
         }
         ]
    },
    {
     "customer": "C2",
     "quantities": [
         {
             "product": "A",
             "quantity": 12
         },
         {
             "product": "B",
             "quantity": 4
         }
         ]
    }
]

我希望产生以下输出(或类似的......):

foreach

换句话说,对于每个部分,使用其百分比值,并将其应用于每个产品数量。给定2个量,2个部分应产生4个结果。给定3个量,2个部分应产生6个结果等等......

我已尝试使用(n/2)*log(1) + (n/4)*log(3) + ... + 1*(log(n-1)). Which is equal to: 过滤器,但无济于事......

2 个答案:

答案 0 :(得分:2)

我认为这会做你想要的。

[
  .quantities as $q
| .portions[]
| .percentage as $p
| {
    customer,
    quantities: [
       $q[] | .quantity = .quantity * $p
    ]
  }
]

答案 1 :(得分:1)

由于您表示您想要笛卡尔积,并且您只是将样本输出作为指示您正在寻找的内容,因此可能值得一提的是,可以非常简单地获得笛卡尔积:

 .portions[] + .quantities[]

这会产生如下对象:

{
  "product": "B",
  "quantity": 10,
  "customer": "C2",
  "percentage": 0.4
}

然后,您可以使用reduce或(效率较低,group_by)以您真正想要的任何形式获取数据。

例如,假设.customer总是一个字符串,我们可以转换 输入所请求的格式如下:

def add_by(f;g): reduce .[] as $x ({}; .[$x|f] += [$x|g]);

[.quantities[] + .portions[]]
| map( {customer, quantities: {product, quantity: (.quantity * .percentage)}} )
| add_by(.customer; .quantities)
| to_entries
| map( {customer: .key, quantities: .value })