json - jq:如何替换数组中的元素或如果它不存在则添加它
问题描述
给定以下 json 结构:
{
"elements": [
{
"name": "disregard",
"value": "me"
},
{
"name": "foo",
"value": "bar"
},
{
"name": "dont-edit",
"value": "me"
}
]
}
如果元素尚不存在,则jq
替换元素或创建/添加元素到数组的适当查询value
是什么?name: foo
解决方案
这是一个安全的行人解决方案:
.elements
|= (map(.name) | index("foo")) as $ix
| if $ix
then .[$ix]["value"] = "BAR"
else . + [{name: "foo", value: "BAR"}]
end
您可能想抽象出"foo"
和"BAR"
位:
上插
# Input is assumed to be an array of {name:_, value:_} objects
def upsert($foo; $bar):
(map(.name) | index($foo)) as $ix
| if $ix then .[$ix]["value"] = $bar else . + [{name: $foo, value: $bar}] end;
用法:
.elements |= upsert("foo"; "BAR")
推荐阅读
- python - pandas 中的条件成对计算
- c - 在c中取消引用指针时遇到问题
- javascript - Utilities.formatDate 使用 Array.map 返回错误的日期
- php - Laravel 与模块共享会话相同的域
- css - 想知道如何通过 tabview 样式属性更改标题?
- c++ - 使用 std::filesystem 替换文件
- apache-spark - AnalysisException: Table or view not found --- 即使我使用“createGlobalTempView”创建了一个视图,如何修复?
- eigen - Eigen 的 LeastSquaresConjugateGradient 求解器:使用不完全 Cholesky 预处理器并指定系数起始值
- c++ - VideoCapture 不会打开视频
- react-native - 如何更改 createBottomTabNavigator 的高度和位置