jq обновляет объекты на основе массива имен объектов - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь обновить некоторые объекты на основе списка объектов.Например, я хочу превратить это:

{
  "names": ["a","c"],
  "del": {
      "a": true,
      "b": true,
      "c": true
  }
}

в это:

{
  "names": ["a","c"],
  "del": {
      "a": false,
      "b": true,
      "c": false
  }
}

Так что для каждого имени объекта в .names обновите свой соответствующий объект в .del Решение, которое я могукажется, что это неэффективно, и мне было интересно, есть ли лучший способ.

[foreach .names[] as $name (.;.del[$name] = false ; .) ] | last

1 Ответ

0 голосов
/ 24 февраля 2019

Я думаю, использование last является хорошим показателем того, что вам не нужны промежуточные значения, и поскольку foreach 1 описывается как:

Синтаксис foreach аналогиченуменьшить, но намеревается разрешить создание предела и редукторов, которые дают промежуточные результаты

Существует эквивалентное уменьшение:

reduce .names[] as $name (.; .del[$name]=false)

Когда обавозможно, уменьшение более эффективно с точки зрения кода, как связь с другими программистами и потенциальной производительности.(Если реализация reduce окажется медленнее, чем шаблон с foreach, то jq может переопределить reduce с этим шаблоном.)

...