jq父级绑定事件的意义,在JQ中绑定父级/同级属性以用于动态条件

本文档介绍如何使用JQ库来过滤JSON数组中的元素,并基于父级和兄弟节点的属性创建新的数据结构。示例中展示了如何根据工作订单的开始日期和供应商ID筛选事件,并将结果添加到每个元素的`conflictsInPeriod`属性中。通过定义辅助函数,实现了更灵活的条件检查和结果返回。最终目标是生成一个包含所有原始数据和新`conflictsInPeriod`数组的输出。
摘要由CSDN通过智能技术生成

I want to create a JQ function that allows me to

to filter an array in the JSON tree, based on parent's / sibling properties;

1 - I want to wrap function but i can't due to the scope of parent;

2 - I want to invoke that function but with other properties;

Some dummy Data:

[

{

"storeId": "s2",

"storehouseInfo": {

"id": "025453",

"name": "00211 NW, OR",

"maxPallets": 10

},

"workorder":{

"id": "w2s2",

"startDate": "2019-09-06T10:00:00.000Z",

"vendorId":"v2"

},

"events": [

{

"id": "e4",

"storeId": "s2",

"vendorId": "v1",

"startDate": "2019-09-05T10:00:00.000Z",

"endDate": "2019-09-14T00:00:00.000Z",

"palletsUsed": 5

},

{

"id": "e5",

"storeId": "s2",

"vendorId": "v2",

"startDate": "2019-09-05T00:00:00.000Z",

"endDate": "2019-09-14T00:00:00.000Z",

"palletsUsed": 5

},

{

"id": "e10",

"storeId": "s2",

"vendorId": "v1",

"startDate": "2019-09-06T10:00:00.000Z",

"endDate": "2019-09-14T00:00:00.000Z",

"palletsUsed": 5

},

{

"id": "e11",

"storeId": "s2",

"vendorId": "v2",

"startDate": "2019-09-06T00:00:00.000Z",

"endDate": "2019-09-14T00:00:00.000Z",

"palletsUsed": 5

},

{

"id": "e12",

"storeId": "s2",

"vendorId": "v2",

"startDate": "2019-09-06T10:00:00.000Z",

"endDate": "2019-09-14T00:00:00.000Z",

"palletsUsed": 5

}

]

},

]

Current working function:

. | map( . as $parent |

.

+

{

"conflictsInPeriod":

[.events[] | (

getFieldsThatCheckConditionInArray(

# conditions

(

( ($parent.workorder.startDate | dateDaysAgo(12*7) ) < .endDate)

and

(.vendorId == $parent.workorder.vendorId)

);

# props we want to return

{

event:.id,

wo_sd: $parent.workorder.startDate[:10],

workorder_id: $parent.workorder.id

})

)]

}

)

Some aux functions:

def generateConflictArray(arrayName;arrayToCheck;conflictToCheck):

map( . +

{

(arrayName): [arrayToCheck | (conflictToCheck)]

}

);

def getFieldsThatCheckConditionInArray(condition;returnValues) :

if (condition) then (returnValues) else empty end;

Desired Function CALL:

. | generateConflictArray(

"conflictsInPeriod";

.events[];

getFieldsThatCheckConditionInArray(

# conditions

(

( ($parent.workorder.startDate | dateDaysAgo(12*7) ) < .endDate)

and

(.vendorId == $parent.workorder.vendorId)

);

# props we want to return

{

event:.id,

event_endDate:.endDate,

wo_sd: $parent.workorder.startDate[:10],

workorder_id: $parent.workorder.id

})

)

Desired Output (All the array data, + newly created array " "conflictsInPeriod"", inside each element of the array):

[

{

"conflictsInPeriod":[

{

"event": "e5",

"workorder_sd": "2019-09-06",

"workorder_id": "w2s2"

},

{

"event_id": "e11",

"workorder_sd": "2019-09-06",

"workorder_id": "w2s2"

},

{

"event_id": "e12",

"workorder_sd": "2019-09-06",

"workorder_id": "w2s2"

}

]

}

]

...

解决方案

Maybe this is closer to what you're looking for:

def etl(keyname; arrayname; cond; result):

def etl:

. as $parent

| .[arrayname][]

| { parent: $parent, child: .}

| select(cond) | result;

{(keyname): map(etl)}

;

## Invocation:

etl("conflictsInPeriod";

"events";

( (.parent.workorder.startDate | dateDaysAgo(12*7) ) < .child.endDate)

and

(.child.vendorId == .parent.workorder.vendorId);

{

event: .child.id,

wo_sd: .parent.workorder.startDate[:10],

workorder_id: .parent.workorder.id

}

)

Notice how the conditions are written in relation to .parent and .child rather than $parent and ..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值