使用JQ为字符串数组元素添加键前缀以对比JSON应用差异
解决JSON环境-应用列表转环境前缀字符串数组的问题
你需要将包含环境与对应应用列表的JSON数据,转换为以环境键为前缀的字符串数组,以便通过minus操作符对比差异,但目前无法实现前缀添加。以下是针对该需求的具体实现方案:
示例输入
{ "qa": [ "app-a", "app-b", "app-c" ], "prod": [ "app-a", "app-c", "app-e" ] }
预期输出
[ "qa:app-a", "qa:app-b", "qa:app-c", "prod:app-a", "prod:app-c", "prod:app-e" ]
实现方案
Python 版本
通过遍历JSON解析后的字典,逐个拼接环境前缀与应用名称:
import json # 解析输入JSON input_json = '''{ "qa": [ "app-a", "app-b", "app-c" ], "prod": [ "app-a", "app-c", "app-e" ] }''' data = json.loads(input_json) # 生成目标数组 result = [] for env, apps in data.items(): for app in apps: result.append(f"{env}:{app}") # 打印格式化后的结果 print(json.dumps(result, indent=2))
JavaScript 版本
利用Object.entries遍历键值对,结合flatMap和map完成拼接与数组扁平化:
const inputData = { "qa": [ "app-a", "app-b", "app-c" ], "prod": [ "app-a", "app-c", "app-e" ] }; // 生成带前缀的数组 const result = Object.entries(inputData).flatMap(([env, apps]) => { return apps.map(app => `${env}:${app}`); }); // 输出格式化结果 console.log(JSON.stringify(result, null, 2));
差异对比补充
转换完成后,可通过集合操作快速找出环境间的应用差异:
- Python 找差异:
qa_set = set(f"qa:{app}" for app in data["qa"]) prod_set = set(f"prod:{app}" for app in data["prod"]) # QA环境独有应用 qa_only = qa_set - prod_set # Prod环境独有应用 prod_only = prod_set - qa_set - JavaScript 找差异:
// QA环境独有应用 const qaOnly = result.filter(item => item.startsWith('qa:') && !result.includes(`prod:${item.split(':')[1]}`)); // Prod环境独有应用 const prodOnly = result.filter(item => item.startsWith('prod:') && !result.includes(`qa:${item.split(':')[1]}`));
内容的提问来源于stack exchange,提问作者brian661
相关产品推荐
相关产品推荐

