A variation of Inian's answer, but without the with_entries() call, with parametrization of the string we're adding, and with some minor simplifications to the logic:
$ jq --arg str '/contact_group/109' '.contact_groups |= map_values(if index($str) then . else . + [$str] end)' file
{
"contact_groups": {
"1": [
"/contact_group/78",
"/contact_group/109"
],
"2": [
"/contact_group/79",
"/contact_group/109"
],
"3": [
"/contact_group/109"
],
"4": [
"/contact_group/109"
],
"5": [
"/contact_group/109"
]
}
}
Another way to do this without the if statement is to use select() to only add stuff to the ones which index() returns null for:
jq --arg str '/contact_group/109' '.contact_groups |= map_values(select(index($str) == null) += [$str])' file
Assuming that the ordering of the bottom-level arrays is unimportant, we can be a bit more "sloppy" and add the string to all arrays while applying unique to remove duplicates:
$ jq --arg str '/contact_group/109' '.contact_groups |= map_values(. += [$str] | unique )' file
{
"contact_groups": {
"1": [
"/contact_group/109",
"/contact_group/78"
],
"2": [
"/contact_group/109",
"/contact_group/79"
],
"3": [
"/contact_group/109"
],
"4": [
"/contact_group/109"
],
"5": [
"/contact_group/109"
]
}
}
With a string that is already present in some arrays:
$ jq --arg str '/contact_group/79' '.contact_groups |= map_values(. += [$str] | unique )' file
{
"contact_groups": {
"1": [
"/contact_group/78",
"/contact_group/79"
],
"2": [
"/contact_group/79"
],
"3": [
"/contact_group/79"
],
"4": [
"/contact_group/79"
],
"5": [
"/contact_group/79"
]
}
}
This approach would be useful if you'd wanted to add many strings to the arrays:
$ jq '.contact_groups |= map_values(. += $ARGS.positional | unique )' --args '/contact_group/79' '/contact_group/89' '/contact_group/99' <file
{
"contact_groups": {
"1": [
"/contact_group/78",
"/contact_group/79",
"/contact_group/89",
"/contact_group/99"
],
"2": [
"/contact_group/79",
"/contact_group/89",
"/contact_group/99"
],
"3": [
"/contact_group/79",
"/contact_group/89",
"/contact_group/99"
],
"4": [
"/contact_group/79",
"/contact_group/89",
"/contact_group/99"
],
"5": [
"/contact_group/79",
"/contact_group/89",
"/contact_group/99"
]
}
}