最简洁的方法是使用jq对数组中的元素对进行分组

时间:2015-08-01 00:14:38

标签: jq

我想转换

[1,"a",2,"b",3,"c"]

[[1,"a"],[2,"b"],[3,"c"]]

我提出的最好的是(使用1.5)

[recurse(.[2:];length>1)[0:2]]

我可以使用更简洁或更高性能或1.4兼容的解决方案吗?

3 个答案:

答案 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
  )
]