HNHacker News
TopNewBestAskShowJobs

preferjq

14 karma · joined April 26, 2022

submissionscomments
preferjq··on Zq: An easier and faster alternative to jq
I would love to see jq libraries become as common as regex libraries so I could use jq directly in whatever stack or environment I'm working on.
preferjq··on Zq: An easier and faster alternative to jq
Here is a straightforward jq translation

    def stores:
      [
        { "store number" : 1, "state" : "MA" },
        { "store number" : 2, "state" : "MA" },
        { "store number" : 3, "state" : "CA" },
        { "store number" : 4, "state" : "CA" }
      ];
    def sales:
      [
        { "product" : "broiler", "store number" : 1, "quantity" : 20  },
        { "product" : "toaster", "store number" : 2, "quantity" : 100 },
        { "product" : "toaster", "store number" : 2, "quantity" : 50 },
        { "product" : "toaster", "store number" : 3, "quantity" : 50 },
        { "product" : "blender", "store number" : 3, "quantity" : 100 },
        { "product" : "blender", "store number" : 3, "quantity" : 150 },
        { "product" : "socks", "store number" : 1, "quantity" : 500 },
        { "product" : "socks", "store number" : 2, "quantity" : 10 },
        { "product" : "shirt", "store number" : 3, "quantity" : 10 }
      ];
    
    [
        {store: stores[], sale: sales[]}
      | select(.store."store number" == .sale."store number")
      | { nb:    .store."store number",
          state: .store.state,
          sold: .sale.product
        }
    ]
Try it online - https://tio.run/##rZPPUsMgEMbP5Sl2ctIZmklbe6HTg@PZJ8jkkD84Rh...
preferjq··on Zq: An easier and faster alternative to jq
I completely agree when your goal is GSD just use the tools you have.

When you have time to sharpen the saw come back and dig into the details of how jq and tools like it work and where their limits are. Looking at the jq builtins[1] can be very enlightening

If you get to the point where your goal is to increase your jq skills I'd recommend looking at the jq questions on Stack Overflow and posting your own solution. Contributing a solution to https://rosettacode.org/wiki/Category:Jq is also good.

1- https://github.com/stedolan/jq/blob/master/src/builtin.jq

preferjq··on Zq: An easier and faster alternative to jq
"cobbled-together" jq as it often appears in the wild will often compare badly with crafted solutions because the writer's goal is usually GSD and not write pretty code.

People with the time and inclination to slow down and think a little more about how the tools work will produce cleaner solutions.

In your example to convert

    {"name":"foo","vals":[1,2,3]}
to

    {"name":"foo","val":1}
    {"name":"foo","val":2}
    {"name":"foo","val":3}
All you need is this jq filter

    {name:.name, val:.vals[]}
To me this is much better than the proposed zq or jq solution you're using as a basis for comparison. You could almost use the shorter

    .vals = .vals[]
if the name in the output didn't change.

These filters takes advantage of how jq's [] operator converts a single result into separate results. For people new to jq this behavior is often confusing unless they've seen things like Cartesian products.

.[] - https://stedolan.github.io/jq/manual/#Array/ObjectValueItera...