jsonnet std.mapWithKey — не генерирует массив?

#jsonnet

#jsonnet

Вопрос:

У меня есть локальный объект jsonnet, определенный как so:

 local compactRules = {
  key1: "val1",
  key2: "val2",
  key3: "val3"
};
  

И я хотел бы сгенерировать этот массив:

 [
  {
    rule: "key1",
    action: "val1",
  },
  {
    rule: "keyk2",
    action: "val2"
   }
  // ...
]
  

И я удивлен, std.mapWithKey что не доставил. В документах ничего не упоминается о формате вывода, и я все еще смущен его поведением:

 std.mapWithKey(function(key_name, value) {
  rule: key_name,
  action: value
}, compactRules)
  

Выдает:

 {
   "key1": {
      "action": "val1",
      "rule": "key1"
   },
   "key2": {
      "action": "val2",
      "rule": "key2"
   },
   "key3": {
      "action": "val3",
      "rule": "key3"
   }
}
  

Почему он использует исходные ключи в результирующем объекте, если я уже сам обрабатываю ключи в функции?

Я бы не был так недоволен, если бы не std.objectValues функция, которая могла бы возвращать только значения всех полей в виде массива, то есть интересующего меня массива.

Ответ №1:

Это то, что вам нужно:

 std.map(function(key_name) {
  rule: key_name,
  action: compactRules[key_name],
}, std.objectFields(compactRules))
  

Хотя, похоже, другие заметили отсутствие этой функциональности вhttps://github.com/google/jsonnet/issues/543 .

Ответ №2:

Мой вариант использования — обратный. Вот пример:

 local f(a,o) = a   [{[o.id]:o.price}];
local arr = [{id:'foo', price:'high'},{id:'bar', price:'low'}];
std.foldl(f, arr, [])