我希望能够使用 {
"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:
过滤器,但无济于事......
答案 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 })