我有一个要求,我需要过滤对象数组并检查所有行的“Id”是否相同。如果相同,则第一行中的“QTY”应保留下例中的源值“50”,而具有相同“Id”的其他行的“QTY”将为0。但是,如果“Id”不同在所有行中,那么“数量”应该保留来自所有行源的相同值。
输入有效负载:
[
{
"QTY": 50,
"Id": "1111"
},
{
"QTY": 50,
"Id": "1111"
},
{
"QTY": 50,
"Id": "1111"
}
]
预期输出:
[
{
"QTY": 50,
},
{
"QTY": 0,
},
{
"QTY": 0,
}
]
如果输入在所有行中都带有不同的“Id”,如下所示
[
{
"QTY": 50,
"Id": "1111"
},
{
"QTY": 50,
"Id": "1133"
},
{
"QTY": 50,
"Id": "1122"
}
]
那么预期结果应该是:
[
{
"QTY": 50,
},
{
"QTY": 50,
},
{
"QTY": 50
}
]
这是一个简单的映射,仅保留
QTY
属性,但条件是仅传递相同的值,除非存在唯一的 Id
并且索引不是第一项。在这种情况下,我们将值替换为 0。我编写了一个辅助函数,通过按 Id
分组并计算分组键的数量来确定是否存在唯一的 Id
。如果数字为 1,则只有一个 Id
。我将其用作条件,如果为 true,我会检查映射中的索引以设置 0。
%dw 2.0
output application/json
fun singleId(a)=sizeOf(a groupBy $.Id pluck $$) == 1
---
payload map (
QTY: if (singleId(payload)) (if ($$==0) $.QTY else 0)
else $.QTY
)