как добавить элемент в список, только если он еще не существует, если список пуст, создать его? - PullRequest
0 голосов
/ 12 мая 2018

ввод

{
  "apps": [
    {
      "name": "whatever1",
      "id": "ID1"
    },
    {
      "name": "whatever2",
      "id": "ID2",
      "dep": [
        "a.jar"
      ]
    },
    {
      "name": "whatever3",
      "id": "ID3",
      "dep": [
        "a.jar",
        "b.jar"
      ]
    }
  ]
}

выход

{
  "apps": [
    {
      "name": "whatever1",
      "id": "ID1",
      "dep": [
        "b.jar"
      ]
    },
    {
      "name": "whatever2",
      "id": "ID2",
      "dep": [
        "a.jar",
        "b.jar"
      ]
    },
    {
      "name": "whatever3",
      "id": "ID3",
      "dep": [
        "a.jar",
        "b.jar"
      ]
    }
  ]
}

в приведенном выше примере

  • whatever1 не имеет dep, поэтому создайте его.
  • whatever2 имеет dep и не имеет b.jar, поэтому добавьте b.jar
  • whatever3 aready имеет dep и b.jar там нетронутым.

что я пробовал.

   # add blindly, whatever3 is not right 
   cat dep.json | jq '.apps[].dep += ["b.jar"]'
   # missed one level and whatever3 is gone.
   cat dep.json | jq '.apps | map(select(.dep == null or (.dep | contains(["b.jar"]) | not)))[] | .dep += ["b.jar"]'

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Для ясности давайте определим вспомогательную функцию для выполнения основной задачи:

# It is assumed that the input is an object
# that either does not have the specified key or
# that it is array-valued
def ensure_has($key; $value):
  if has($key) and (.[$key] | index($value)) then .
  else .[$key] += [$value]
  end ;

Теперь задачу можно выполнить простым способом:

.apps |= map(ensure_has("dep"; "b.jar"))

В качестве альтернативы...

.apps[] |= ensure_has("dep"; "b.jar")
0 голосов
/ 12 мая 2018

после некоторых проб и ошибок, похоже, это один из способов сделать это.

cat dep.json | jq '.apps[].dep |= (. + ["b.jar"] | unique)'
...