我想转换
[1,"a",2,"b",3,"c"]
到
[[1,"a"],[2,"b"],[3,"c"]]
我提出的最好的是(使用1.5)
[recurse(.[2:];length>1)[0:2]]
我可以使用更简洁或更高性能或1.4兼容的解决方案吗?
答案 0 :(得分:1)
就我个人而言,我会尝试做一些像你一样的事,对我来说,从功能的角度来看是正确的。
但还有其他方法可以表达。您可以利用以下事实:在将数组转换为条目时,您将获得一组索引/值对。
to_entries | group_by(.key/2 | floor) | map(map(.value))
另一方面,您也可以使用一系列数字创建数组切片。我认为这可能比递归更好。
. as $arr | [ range(0; length/2) * 2 | $arr[.:.+2] ]
答案 1 :(得分:1)
以下概括了该任务,与jq 1.4一起使用,具有jq 1.5中的优化的高性能,并且可以用于实现rho / 1(如R' s" dim(z)< - c(3,5,100)"和APL"A⍴B"):
# Input: an array
# Output: a stream of arrays
# If the input is [] then the output stream is empty,
# otherwise it consists of arrays of length n, each array consisting
# of successive elements from the input array, padded with nulls.
def takes(n):
def _takes:
if length == 0 then empty
elif length < n then .[n-1] = null
else .[0:n], (.[n:] | _takes)
end;
_takes;
使用&#34;需要&#34;,可以使用以下方式完成任务: [takes(2)]
使用&#34; rho&#34;,有几种可能性,特别是:
[rho( [ 2 ] )]
# or:
rho([3,2])
有关&#34; rho&#34;的更多信息,请参阅https://github.com/stedolan/jq/issues/829
答案 2 :(得分:0)
也许不是最简洁的方法,但这是使用 foreach 来收集和发出值对的解决方案。
[
foreach .[] as $x (
[] # init
; if length>1 then [] else . end # update
| . + [$x]
; if length>1 then . else empty end # extract
)
]