假设我在jq命令中输入了以下json:
[
{"type":"dog", "set":"foo"},
{"type":"bird", "set":"bar"},
{"type":"cat", "set":"blaz"},
{"type":"fish", "set":"mor"}
]
我知道此数组中有一个元素,其type
是“ bird”,在这种情况下是第二个元素。但是我想要它的下一个(或上一个)同级,即它之后(之前)的元素,在这种情况下,是第三个(第一个)元素。如何在jq中获得它?
另外,我还有另一个问题:如果匹配的元素(即我知道的type
值的元素)是数组中的最后一个元素,我希望它获得下一个第一个(也就是说,循环遍历数组)而不返回任何内容。无论匹配的元素是第一个元素(然后我想获取最后一个元素),都是相同的。
答案 0 :(得分:1)
为特定起见,让我们假设您要提取<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
var socket = io('ws://127.0.0.1:3000');
socket.emit('ui:index:loaded',{_id: '123456'});
socket.on('app:banner:loaded',function(obj){
console.log(obj);
});
socket.on('app:collection:loaded',function(obj){
console.log(obj);
});
</script>
三元组作为数组,其中(before, focus, after)
和before
如前所述。为简单起见,我们还假设源数组的长度至少为2。
接下来,为了便于说明和理解,我们将定义一个辅助函数来提取以下三个项目:
after
现在我们只需要找到索引并使用它即可:
# $i is assumed to be a valid index into the input array,
# which is assumed to be of length at least 2
def triple($i):
if $i == 0 then [last] + .[0:2]
elif $i == (length-1) then .[$i-1: $i+2] + [first]
else .[$i-1: $i+2]
end;
使用这种方法,可以轻松获得其他变体。
答案 1 :(得分:1)
让我还为您提供一种替代解决方案,基于JSON的步行路径Unix工具: jtc
-您可以在其中将查询逻辑“编码”到路径中:< / p>
例如找到"type":"bird"
记录,然后在同级对象之前(在父级数组中),就像这样:
bash $ <file.json jtc -w'[type]:<bird> [-1]<idx>k [-1]>idx<t-1' -r
{ "set": "foo", "type": "dog" }
让我为您分解一下:
[type]:<bird>
-将递归地找到一条记录"type":"bird"
[-1]<idx>k
-将在JSON树中增加1层(选择父级,有效选择整个记录{"type":"bird", "set":"bar"}
),并将其数组索引存储到命名空间idx
[-1]>idx<t-1
-将再次在JSON中提升1级(选择顶部数组),并将(以非递归方式)搜索索引(存储在idx
中且偏移{{1 }} 平均一次可以选择下一个兄弟姐妹:
-1
或者,选择第一个条目(基于最后一个匹配项):
bash $ <file.json jtc -w'[type]:<bird>[-1]<idx>k[-1]>idx<t1'
{ "set": "blaz", "type": "cat" }
(只需放一些肯定较低的值作为相对量-它将标准化为第一个条目)
PS>披露:我是bash $ <file.json jtc -w'[type]:<fish>[-1]<idx>k[-1]>idx<t-1000' -r
{ "set": "foo", "type": "dog" }
工具的创建者