#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, [])