YAML объединяет несколько массивов в один - PullRequest
1 голос
/ 06 мая 2020

Я пытаюсь объединить массивы / списки в один большой список, но всегда отсутствуют элементы:

commonFields: &commonFields
- {label: title}
- {label: url}

extraFields: &extraFields
- {label: blocks}
- {label: hide}

metaFields: &metaFields
- {label: robots}
- {label: description}

fields:
- <<: *commonFields
- <<: *metaFields
- <<: *extraFields

онлайн-анализатор yaml с этим примером: ссылка

1 Ответ

0 голосов
/ 06 мая 2020

Ключ слияния является необязательным расширением устаревшего YAML 1.1. Давайте обсудим, что происходит в первом элементе:

- <<: *commonFields

SP c говорит:

Если значение, связанное с ключом слияния, является последовательностью, тогда эта последовательность ожидается, что они будут содержать узлы сопоставления, и каждый из этих узлов объединяется по очереди в соответствии с порядком в последовательности.

*commonFields ссылается на последовательность, поэтому применимо следующее правило: мы объединяем каждое сопоставление в указанная последовательность в текущее отображение (текущее отображение - <<: *commonFields). Объединение первой последовательности приводит к

- label: title

Затем мы объединяем второе отображение. Теперь применяется это правило:

Если значение, связанное с ключом, является одним узлом сопоставления, каждая из его пар ключ / значение вставляется в текущее сопоставление, , если ключ уже не существует в это.

В нашем сопоставлении уже есть ключ метка , поэтому пара ключ-значение label: url из второго сопоставления не объединяется.


Вероятно, вы неправильно поняли, что делает <<. Он объединяет отображения в отображение, которое является частью самого себя . Он не объединяет элементы последовательности в родительскую последовательность этого сопоставления. В стандартном YAML нет способа сделать это, и никакие расширения, о которых я знаю, не делают этого (даже << не является стандартным YAML).

Вы можете определить локальный тег для этого, например:

fields: !flatten
- *commonFields
- *metaFields
- *extraFields

Однако вам нужно будет самостоятельно реализовать тег !flatten в коде, который загружает этот YAML.

В качестве альтернативы вы можете делать то, что делают все остальные, и использовать механизм шаблонов для предварительного обработать ваш YAML (Jinja2, Liquid и др. c).

...