Javascript 是否可以使用JSON对象在jq中进行嵌套查询?
以下是我的JSON:Javascript 是否可以使用JSON对象在jq中进行嵌套查询?,javascript,json,jq,Javascript,Json,Jq,以下是我的JSON: { "A":[ { "AT":"text" }, { "AT":"text2" } ], "B":[ { "name":"text", "power":10 }, { "name":"text1", "power":20 },
{
"A":[
{
"AT":"text"
},
{
"AT":"text2"
}
],
"B":[
{
"name":"text",
"power":10
},
{
"name":"text1",
"power":20
},
{
"name":"text2",
"power":40
}
]
}
我希望所有的B元素都与A元素同名。因此,在这种情况下,结果将是['text',10,'text2',40]。我尝试了此查询[.B[]|[.name、.power][]]|mapin[.A[].AT],但它不起作用,它向我抛出了一个错误:
jq:错误:23:无法使用字符串A索引字符串
退出状态5
我不知道如何修复它,但我认为它与父节点有关,它无法识别in函数中的嵌套查询。那么,是否可以用这种语言进行嵌套查询,以及如何处理其他情况(如其他函数或管道)的嵌套查询问题
PS:我在JAVASCRIPT node.js中工作
新问题,我有以下疑问:
.Move | map{.name:{accurity:.url.accurity,damage | class:.url.damage | class.name,power:.url.power,priority:.url.priority,target:.url.target.name,type:.url.type.name,null}}}}添加为$b |。结果|选择.name==bulba | map.url.moves[].Move.name |[,$b[.[].[]
而且它在没有select的情况下可以完美地工作。name==bulba
jq:错误:158:无法使用字符串名称索引数组
我应该用这个来显示JSON吗?因为它比前一个稍微大一点
但首先要做的是:
{
"results":[
{
"name":"bulba",
"url":{
"moves":[
{
"move":{
"name":"flamiche"
}
}
]
}
},
{
"name":"sala",
"url":{
"moves":[
{
"move":{
"name":"DAMSSSS"
}
}
]
}
}
],
"Move":[
{
"name":"flamiche",
"url":{
"accuracy":50,
"damage_class":{
"name":"physical"
},
"power":50,
"priority":0,
"target":{
"name":"foe"
},
"type":{
"name":"fire"
}
}
},
{
"name":"DAMSSSS",
"url":{
"accuracy":90,
"damage_class":{
"name":"status"
},
"power":null,
"priority":2,
"target":{
"name":"self"
},
"type":{
"name":"grass"
}
}
}
]
}
若要获取A上的所有B对象,可以使用Set和concat创建具有所有A值的对象。使用过滤器过滤对象B
var obj={A:[{AT:text},{AT:text2}],B:[{name:text,power:10},{name:text1,power:20},{name:text2,power:40}]}
var allAs=新集合[]。concat…obj.A.mapo=>Object.valueso;
var result=obj.B.filtero=>allAs.haso.name;
console.logresult 您正在将[.B[]|[.name、.power][]]的产品(将是字符串数组)传输到mapin[.A[].AT],即输入已更改且.A已丢失,您正在尝试从这些字符串获取.A[].AT。这不是唯一的问题,也是你犯错误的原因。你最好这样做:
( .B | map({(.name): .power}) | add ) as $b
| .A | map(.AT | [., $b[.]]) | add
如果使用reduce输入太大,则可以获得更好的性能:
( reduce .B[] as $b ({}; . + ($b | {(.name): .power})) ) as $b
| reduce .A[].AT as $a ([]; . + [$a, $b[$a]])
至于第二个问题,通过将结果(一个对象数组)传递给select.name==bulba,正如错误消息所述,您试图用字符串索引数组。要过滤“结果”下的对象,请将“选择”移动到类似地图的位置:
我更喜欢第一个答案,因为我想使用query而不是直接使用js,不过还是要谢谢你!。在|[,$b[.]]与[.AT,$b[.AT]]相同。它创建一个数组,由.AT和在$b中键入.AT的值组成。map定义为def mapf:[.]|f];,它扩展其输入,将过滤器f应用于所有扩展的值,并将结果值打包到一个数组中。看,我找到了办法!!看看这个.B | map{.name:{power:.power,accurity}}}添加为$B |.A | map.at |[,$B[.]]]|添加效果非常好!谢谢!很好,您可以只编写power而不是power:.power.no,select定义为def selectf:if f then。否则为空端;,实际情况是:[.results[]| if.name==bulba then.else空end |.url.moves[].move.name |[,$b[.][]。我们正在扩展结果,过滤一些对象,为每个对象创建一个数组,并将它们全部打包回一个数组。请提供一个最小且完整的JSON文件示例,我们可以将其复制并粘贴到本地文件并处理它。你的例子现在是无效的JSON。我直接发布了我的JSON的simpelst版本,因为我不知道如何为我的JSON创建可链接的复制粘贴。很抱歉,好的,请参阅我的编辑。
map(select(.name == "bulba") | .url.moves[].move.name | [., $b[.][]])