如何使用jq为bundleDependencies数组添加元素时忽略重复项
使用jq向bundleDependencies添加依赖时忽略重复项
问题场景
现有如下包配置JSON字符串:
json_string="$(cat <<'END' { "name": "hello", "dependencies": { "progress": "^2.0.0", "tar": "^6.2.1" }, "devDependencies": { "node-fetch": "~2.6.1", "yargs": "^16.2.0" } } END )"
通过以下命令依次向bundleDependencies数组添加依赖键时:
# 添加dependencies的键到bundleDependencies json_string="$(jq ".bundleDependencies += (.dependencies | keys)" <<< "$json_string")" # 添加devDependencies的键到bundleDependencies json_string="$(jq ".bundleDependencies += (.devDependencies | keys)" <<< "$json_string")"
重复执行添加devDependencies的命令,会导致数组中出现重复项:
jq ".bundleDependencies += (.devDependencies | keys)" <<< "$json_string"
输出结果:
{ "name": "hello", "dependencies": { "progress": "^2.0.0", "tar": "^6.2.1" }, "devDependencies": { "node-fetch": "~2.6.1", "yargs": "^16.2.0" }, "bundleDependencies": [ "progress", "tar", "node-fetch", "yargs", "node-fetch", "yargs" ] }
解决方法
方法1:添加后自动去重
每次添加元素后,用unique过滤器对bundleDependencies数组去重,确保数组内元素唯一:
# 添加dependencies并去重 json_string="$(jq ".bundleDependencies += (.dependencies | keys) | .bundleDependencies |= unique" <<< "$json_string")" # 添加devDependencies并去重 json_string="$(jq ".bundleDependencies += (.devDependencies | keys) | .bundleDependencies |= unique" <<< "$json_string")"
重复执行添加命令时,数组会自动去重,不会产生重复项。
方法2:一次性合并所有目标键并去重
如果无需分步添加,可直接合并dependencies和devDependencies的所有键,去重后赋值给bundleDependencies:
json_string="$(jq ".bundleDependencies = (.dependencies | keys) + (.devDependencies | keys) | .bundleDependencies |= unique" <<< "$json_string")"
方法3:精准添加不存在的元素
通过reduce遍历要添加的键,仅当元素不存在于数组中时才追加:
# 确保bundleDependencies存在(无则初始化为空数组),再添加devDependencies中未存在的键 json_string="$(jq ' .bundleDependencies //= [] | reduce (.devDependencies | keys[]) as $key (.; if .bundleDependencies | index($key) then . else .bundleDependencies += [$key] end ) ' <<< "$json_string")"
内容的提问来源于stack exchange,提问作者stackbiz
相关产品推荐
相关产品推荐

