基于项目匹配 Dataweave 2.0 计算 Json 中的元素数
Counting Number of elements in Json based on Item match Dataweave 2.0
我有如下输入,响应需要 orderBy ClientNo
并根据相同 ClientNo
.
的重复次数添加 SeqNo
例如 ClientNo:7011
重复 2 次,它应该添加 seqNo: 1 和下一个对象为 2,类似 ClientNo:7022
等..
如果问题不清楚,请告诉我。提前感谢您的帮助。
%dw 2.0
---
payload orderBy $.ClientNo map (payload01,index) -> {
ClientNo: payload01.ClientNo,
Quantity:payload01.Quantity,
SeqNo: ????( Required to calculate repeats of seqNo based on $.ClientNo match dynamically )
Volume:payload01.Volume,
TrackDetails:payload01.TrackDetails
}
输入:
[
{
"ClientNo":7011,
"Quantity":80,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7011,
"Quantity":60,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":10,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":20,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":70,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
}
]
输出:
[
{
"ClientNo":7011,
"Quantity":80,
"SeqNo":1,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7011,
"Quantity":60,
"SeqNo":2,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":10,
"SeqNo":1,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":20,
"SeqNo":2,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":70,
"SeqNo":3,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"SeqNo":1,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"SeqNo":2,
"Volume":10,
"TrackDetails":"Test"
}
]
试试这个,有一个警告要让它工作,你必须使用 4.3.0 Mule 运行时,它可以用以前的版本来完成——让我知道,我会尽可能地做:
%dw 2.0
output application/dw
var data = [
{
"ClientNo":7011,
"Quantity":80,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7011,
"Quantity":60,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":10,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":20,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":70,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
}
]
---
(do {
var counters = data.*ClientNo reduce (e,acc={}) -> acc ++ {(e): 0}
---
data reduce (
(rec, result = {c: counters,r : []}) -> do {
var updatedCounters = result.c update {
case f at ."$(rec.ClientNo)" -> f + 1
}
---
{
c: updatedCounters,
r: result.r + {(rec), SeqNo: updatedCounters[rec.ClientNo as Key]}
}
}
)
}).r
解决方案的关键是跟踪一组计数器,reduce
也感觉很自然。
编辑:4.3.0 之前的 mule 运行时解决方案
%dw 2.0
output application/dw
var data = [
{
"ClientNo":7011,
"Quantity":80,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7011,
"Quantity":60,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":10,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":20,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":70,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
}
]
---
(do {
var counters = data.*ClientNo reduce (e,acc={}) -> acc ++ {(e): 0}
---
data reduce (
(rec, result = {c: counters,r : []}) -> do {
var k = rec.ClientNo as Key
var updatedCounters = {
(result.c - k),
(k): result.c[k] + 1
}
---
{
c: updatedCounters,
r: result.r + {(rec), SeqNo: updatedCounters[k]}
}
}
)
}).r
orderBy $.SeqNo
orderBy $.ClientNo
我有如下输入,响应需要 orderBy ClientNo
并根据相同 ClientNo
.
SeqNo
例如 ClientNo:7011
重复 2 次,它应该添加 seqNo: 1 和下一个对象为 2,类似 ClientNo:7022
等..
如果问题不清楚,请告诉我。提前感谢您的帮助。
%dw 2.0
---
payload orderBy $.ClientNo map (payload01,index) -> {
ClientNo: payload01.ClientNo,
Quantity:payload01.Quantity,
SeqNo: ????( Required to calculate repeats of seqNo based on $.ClientNo match dynamically )
Volume:payload01.Volume,
TrackDetails:payload01.TrackDetails
}
输入:
[
{
"ClientNo":7011,
"Quantity":80,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7011,
"Quantity":60,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":10,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":20,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":70,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
}
]
输出:
[
{
"ClientNo":7011,
"Quantity":80,
"SeqNo":1,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7011,
"Quantity":60,
"SeqNo":2,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":10,
"SeqNo":1,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":20,
"SeqNo":2,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":70,
"SeqNo":3,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"SeqNo":1,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"SeqNo":2,
"Volume":10,
"TrackDetails":"Test"
}
]
试试这个,有一个警告要让它工作,你必须使用 4.3.0 Mule 运行时,它可以用以前的版本来完成——让我知道,我会尽可能地做:
%dw 2.0
output application/dw
var data = [
{
"ClientNo":7011,
"Quantity":80,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7011,
"Quantity":60,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":10,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":20,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":70,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
}
]
---
(do {
var counters = data.*ClientNo reduce (e,acc={}) -> acc ++ {(e): 0}
---
data reduce (
(rec, result = {c: counters,r : []}) -> do {
var updatedCounters = result.c update {
case f at ."$(rec.ClientNo)" -> f + 1
}
---
{
c: updatedCounters,
r: result.r + {(rec), SeqNo: updatedCounters[rec.ClientNo as Key]}
}
}
)
}).r
解决方案的关键是跟踪一组计数器,reduce
也感觉很自然。
编辑:4.3.0 之前的 mule 运行时解决方案
%dw 2.0
output application/dw
var data = [
{
"ClientNo":7011,
"Quantity":80,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7011,
"Quantity":60,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":10,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":20,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7022,
"Quantity":70,
"Volume":10,
"TrackDetails":"Test"
},
{
"ClientNo":7023,
"Quantity":100,
"Volume":10,
"TrackDetails":"Test"
}
]
---
(do {
var counters = data.*ClientNo reduce (e,acc={}) -> acc ++ {(e): 0}
---
data reduce (
(rec, result = {c: counters,r : []}) -> do {
var k = rec.ClientNo as Key
var updatedCounters = {
(result.c - k),
(k): result.c[k] + 1
}
---
{
c: updatedCounters,
r: result.r + {(rec), SeqNo: updatedCounters[k]}
}
}
)
}).r
orderBy $.SeqNo
orderBy $.ClientNo