0

I would like in JQ to substitute the values in the first array with the names in the second array based on the key "size" while keeping the length of the first array unchanged.

[
    [{\"size\":0},{\"size\":1},{\"size\":2},{\"size\":3},{\"size\":4},{\"size\":5},{\"size\":6},{\"size\":7},{\"size\":8},{\"size\":9},{\"size\":0},{\"size\":1},{\"size\":2},{\"size\":3},{\"size\":4},{\"size\":5},{\"size\":6},{\"size\":7},{\"size\":8},{\"size\":0},{\"size\":1},{\"size\":2},{\"size\":3},{\"size\":4},{\"size\":5},{\"size\":6},{\"size\":7},{\"size\":8}]
    
    [{\"size\":0,\"name\":\"6M\"},{\"size\":1,\"name\":\"6.5M\"},{\"size\":2,\"name\":\"7M\"},{\"size\":3,\"name\":\"7.5M\"},{\"size\":4,\"name\":\"8M\"},{\"size\":5,\"name\":\"8.5M\"},{\"size\":6,\"name\":\"9M\"},{\"size\":7,\"name\":\"9.5M\"},{\"size\":8,\"name\":\"10M\"},{\"size\":9,\"name\":\"11M\"}]

]

So the wanted result would look like this:

[{\"size\":6M},{\"size\":6.5M},{\"size\":7M},{\"size\":7.5M},{\"size\":8M},{\"size\":8.5M},{\"size\":9M},{\"size\":9.5M},{\"size\":10M},{\"size\":11M},{\"size\":6M},{\"size\":6.5M},{\"size\":7M},{\"size\":7.5M},{\"size\":8M},{\"size\":8.5M},{\"size\":9M},{\"size\":9.5M},{\"size\":10M},{\"size\":6M},{\"size\":6.5M},{\"size\":7M},{\"size\":7.5M},{\"size\":8M},{\"size\":8.5M},{\"size\":9M},{\"size\":9.5M},{\"size\":10M}]

I used this input to obtain the above arrays jq " [ .DATA.product.traits|([.colors.colorMap[]| {size:.sizes[]}]), ( [ .sizes.sizeMap[]| {size:.id, name}])]" and then tried using if-then-else statement (|if (.[0:-1][][].size == .[-1][].size) then [.[-1][].name ] else null end") but I was unable to reach the desired output..

0

2 Answers 2

0

With json input file:

[
    [
        {"size":0},{"size":1},{"size":2},{"size":3},{"size":4},
        {"size":5},{"size":6},{"size":7},{"size":8},{"size":9},
        {"size":0},{"size":1},{"size":2},{"size":3},{"size":4},
        {"size":5},{"size":6},{"size":7},{"size":8},{"size":0},
        {"size":1},{"size":2},{"size":3},{"size":4},{"size":5},
        {"size":6},{"size":7},{"size":8}
    ],
    [
        {"size":0,"name":"6M"},{"size":1,"name":"6.5M"},
        {"size":2,"name":"7M"},{"size":3,"name":"7.5M"},
        {"size":4,"name":"8M"},{"size":5,"name":"8.5M"},
        {"size":6,"name":"9M"},{"size":7,"name":"9.5M"},
        {"size":8,"name":"10M"},{"size":9,"name":"11M"}
    ]
]

and jq filter file:

. as $in |
reduce $in[1][] as $i ({}; .[$i.size|tostring] = $i.name) | . as $d |
reduce $in[0][] as $j ([]; . += [{ "size" : $d[$j.size|tostring] }])

you can run:

jq -c -f filter json

giving (wrapped for legibility):

[{"size":"6M"},{"size":"6.5M"},{"size":"7M"},{"size":"7.5M"},
{"size":"8M"},{"size":"8.5M"},{"size":"9M"},{"size":"9.5M"},
{"size":"10M"},{"size":"11M"},{"size":"6M"},{"size":"6.5M"},
{"size":"7M"},{"size":"7.5M"},{"size":"8M"},{"size":"8.5M"},
{"size":"9M"},{"size":"9.5M"},{"size":"10M"},{"size":"6M"},
{"size":"6.5M"},{"size":"7M"},{"size":"7.5M"},{"size":"8M"},
{"size":"8.5M"},{"size":"9M"},{"size":"9.5M"},{"size":"10M"}]

Alternative filter:

. as $in |
reduce $in[1][] as $i ({}; .[$i.size|tostring] = $i.name) | . as $d |
$in[0] | map_values ( .size = $d[.size|tostring] )
Sign up to request clarification or add additional context in comments.

1 Comment

@peak are you able to tell me why this is marked as a duplicate when the other question was asked later and the only answer does not actually produce the requested output?
0

I first grouped by array2 into an object for easier lookup when iterating the first array.

var str1 = "[{\"size\":0},{\"size\":1},{\"size\":2},{\"size\":3},{\"size\":4},{\"size\":5},{\"size\":6},{\"size\":7},{\"size\":8},{\"size\":9},{\"size\":0},{\"size\":1},{\"size\":2},{\"size\":3},{\"size\":4},{\"size\":5},{\"size\":6},{\"size\":7},{\"size\":8},{\"size\":0},{\"size\":1},{\"size\":2},{\"size\":3},{\"size\":4},{\"size\":5},{\"size\":6},{\"size\":7},{\"size\":8}]"

var str2 = "[{\"size\":0,\"name\":\"6M\"},{\"size\":1,\"name\":\"6.5M\"},{\"size\":2,\"name\":\"7M\"},{\"size\":3,\"name\":\"7.5M\"},{\"size\":4,\"name\":\"8M\"},{\"size\":5,\"name\":\"8.5M\"},{\"size\":6,\"name\":\"9M\"},{\"size\":7,\"name\":\"9.5M\"},{\"size\":8,\"name\":\"10M\"},{\"size\":9,\"name\":\"11M\"}]"

var arr1 = JSON.parse(str1)
var arr2 = JSON.parse(str2)


var obj2 = arr2.reduce(function(agg, item) {
  agg[item.size] = item
  return agg;
}, {})


arr1.map(function(item) {
  item.size = obj2["" + item.size].name;
})

console.log(arr1);
.as-console-wrapper {
  max-height: 100% !important;
}

3 Comments

The OP asked for a jq answer.
@peak the question was only edited to mention jq after this answer was written
Thanks. Also vanilla javascript works with jquery.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.