bashjq

How to ignore duplicated array items in jq


I want to set bundleDependencies by using jq:

json_string="$(cat <<'END'
{
  "name": "hello",
  "dependencies": {
    "progress": "^2.0.0",
    "tar": "^6.2.1"
  },
  "devDependencies": {
    "node-fetch": "~2.6.1",
    "yargs": "^16.2.0"
  }
}
END
)"

Now add dependencies to the bundleDependencies:

# json_string="$(jq -r ".bundleDependencies += (.dependencies | keys)" <<< "$json_string")"

Now add devDependencies to the bundleDependencies:

# json_string="$(jq -r ".bundleDependencies += (.devDependencies | keys)" <<< "$json_string")"

Finally, add devDependencies again for testing if jq can ignore the duplicated items:

# jq -r ".bundleDependencies += (.devDependencies | keys)" <<< "$json_string"
{
  "name": "hello",
  "dependencies": {
    "progress": "^2.0.0",
    "tar": "^6.2.1"
  },
  "devDependencies": {
    "node-fetch": "~2.6.1",
    "yargs": "^16.2.0"
  },
  "bundleDependencies": [
    "progress",
    "tar",
    "node-fetch",
    "yargs",
    "node-fetch",
    "yargs"
  ]
}

How to make jq ignore the duplicated items when it already existed in the array?


Solution

  • jq '.bundleDependencies |= unique'
    

    Documented here.

    It also looks like you can do everything at once, without the need for unique:

    jq ".bundleDependencies += (.dependencies + .devDependencies | keys)"
    

    If bundleDependencies is already populated, you can use this:

    jq ".bundleDependencies = ((.dependencies + .devDependencies | keys) + .bundleDependencies | unique)"