javascript - 修改一个比较两个json的值
问题描述
我有一个 JSON 数据,它是一个字典数组,语法如下:
文件 1.json
[
{
"Date_and_Time": "Dec 29, 2017 15:35:37",
"Componente": "Bar",
"Country": "Brazil",
"Age": "3"
},
{
"Date_and_Time": "Dec 31, 2017 17:35:37",
"Componente": "Foo",
"Country": "France",
"Id": "123456",
"Car": "Ferrari"
}
]
我还有另一个语法相似的 JSON 数据,除了Date_and_Time的字段。
文件2.json
[
{
"Date_and_Time": "Dec 31, 2017 17:35:37",
"Age": "1",
"Country": "France",
"Id": "123456",
"Car": "Ferrari"
},
{
"Date_and_Time": "Mar 31, 2018 14:35:37",
"Componente": "Foo",
"Country": "Germany",
"Id": "2468",
"Genre": "Male"
}
]
两个 JSON 数据具有相同数量的 Date_and_Time 字段。我想要做的是仅将第一个json的值重写为Date_and_Time的第二个json的值
预期输出:file3.json
[
{
"Date_and_Time": "Dec 31, 2017 17:35:37",
"Componente": "Bar",
"Country": "Brazil",
"Age": "3"
},
{
"Date_and_Time": "Mar 31, 2018 14:35:37",
"Componente": "Foo",
"Country": "France",
"Id": "123456",
"Car": "Ferrari"
}
]
只要它有效,我对使用什么没有偏好。我曾考虑过使用 jq ,但由于以下原因它不起作用:
jq -n --argjson oldvals "$(< file1.json)" --argjson newvals "$(< file2.json)" ' reduce range($oldvals | length) as $idx ($oldvals; .[$idx].Date_and_Time = $newvals[$idx].Date_and_Time)' > file3.json
它收到了下一条消息
/usr/bin/jq: the list of argument is too long
解决方案
在他的许可下,这是@oguzismail 的绝佳答案:
jq '
input as $in
| reduce range(length) as $i (.;
.[$i].Date_and_Time = $in[$i].Date_and_Time)
' f1 f2
重要的一点是 -s slurp 命令行选项可以很容易地避免,因为如果考虑到效率,它应该尽可能地避免。
然而,上面的公式有点微妙,因为它取决于一个不太明显的事实,即当input
在没有 -n 命令行选项的情况下使用时,它评估为作为输入呈现的第二个JSON 实体。在本例中,这将是 f2 中的 JSON 实体;.
相比之下,顶层计算为 f1 中的 JSON 实体。
所以这里有一个替代方案,也许更直观地展示了几乎相同的程序:
jq -n '
input as $f2
| input
| reduce range(length) as $i (.;
.[$i].Date_and_Time = $f2[$i].Date_and_Time)
' f2 f1
推荐阅读
- javascript - 为什么将 {} 添加到排序函数会改变答案?
- python - 如何检查 S3 存储桶中的对象在 boto3 中是否公开?
- c++ - 入口点功能分析
- python - 如何使用python脚本删除日志前6个月
- javascript - Javascript读取3个数据->打印实时数据库firebase
- python - 最长公共前缀
- c# - .NET Core API REST C# List into List 为空
- amazon-web-services - 不允许:no-auth-role/CognitoIdentityCredentials 无权执行:geo:ListGeofences on resource:xxxxx
- excel - 运行时错误“1004”:尝试将条件格式应用于表的多个列时,对象“_Global”的方法“范围”失败
- javascript - reactjs中如何多次减量和增加量?