如何在JSONata中迭代数组并添加基于金额判断的flag字段
给JSON中policyList元素添加全量判断flag的实现方案
需求说明
给定包含policyList数组的JSON对象,每个policyList元素包含product子数组,每个product对象都有amount字段。需要为每个policyList元素新增flag字段:
- 当该元素下所有
product的amount值为0时,flag = true - 只要有一个
product的amount不为0,flag = false
实现方案(JavaScript)
假设你的原始JSON数据已解析为JavaScript对象,可通过以下代码完成处理:
// 原始JSON解析后的对象 const data = { "policyList": [ { "product": [{"amount": 0}, {"amount": 0}] }, { "product": [{"amount": 0}, {"amount": 120}] } ] }; // 遍历处理每个policyList元素 data.policyList.forEach(policy => { // 用every方法判断所有product的amount是否全为0 policy.flag = policy.product.every(item => item.amount === 0); }); // 输出处理后的JSON console.log(JSON.stringify(data, null, 2));
实现方案(jq命令行工具)
如果需要在命令行批量处理JSON文件,可使用jq工具:
# 处理input.json并输出到output.json jq '.policyList[] |= (.flag = (.product | all(.amount == 0)))' input.json > output.json
处理后结果示例
{ "policyList": [ { "product": [ {"amount": 0}, {"amount": 0} ], "flag": true }, { "product": [ {"amount": 0}, {"amount": 120} ], "flag": false } ] }
逻辑说明
- JavaScript中,
Array.prototype.every()会遍历数组,只有当所有元素都满足条件(amount === 0)时返回true,否则返回false - jq中,
all(.amount == 0)用于判断product数组的所有元素是否符合条件,通过|=将结果赋值给新增的flag字段
内容的提问来源于stack exchange,提问作者Neha Bhadwal
相关产品推荐
相关产品推荐

