Каждый раз приходится проверять существование каждого уровня вложенности:
Настройки = Новый Структура();
Если НЕ Настройки.Свойство("ui") Тогда
Настройки.Вставить("ui", Новый Структура());
КонецЕсли;
Если НЕ Настройки.ui.Свойство("theme") Тогда
Настройки.ui.Вставить("theme", Новый Структура());
КонецЕсли;
Если НЕ Настройки.ui.theme.Свойство("dark") Тогда
Настройки.ui.theme.Вставить("dark", Истина);
КонецЕсли;
Настройки = Новый Структура();
A1sDS.GetOrInsertPath(Настройки, "ui.theme.dark", Истина);
// Создаст: {ui: {theme: {dark: Истина}}}
GetOrInsertPath() принимает:
Конфиг = Новый Структура();
A1sDS.GetOrInsertPath(Конфиг, "database.connection.timeout", 30);
A1sDS.GetOrInsertPath(Конфиг, "database.connection.pool_size", 10);
A1sDS.GetOrInsertPath(Конфиг, "logging.level", "info");
A1sDS.GetOrInsertPath(Конфиг, "logging.file.path", "C:\logs\app.log");
// Конфиг:
// {
// database: {
// connection: {
// timeout: 30,
// pool_size: 10
// }
// },
// logging: {
// level: "info",
// file: {
// path: "C:\logs\app.log"
// }
// }
// }
КешОбъектов = Новый Структура();
// Первый вызов — создаст узел и вернёт дефолт
РегулярнаяВыражение = A1sDS.GetOrInsertPath(
КешОбъектов,
"regex.inn",
Новый РегулярноеВыражение("^\d{10}(\d{2})?$")
);
// Повторный вызов — вернёт существующий объект
// (дефолт НЕ вставляется!)
РегулярнаяВыражение = A1sDS.GetOrInsertPath(
КешОбъектов,
"regex.inn",
Новый РегулярноеВыражение("ДРУГОЙ_ПАТТЕРН") // ← не выполнится!
);
Пользователь = Новый Структура();
// Дефолтные настройки при первом входе
Язык = A1sDS.GetOrInsertPath(
Пользователь,
"preferences.language",
"ru"
);
Тема = A1sDS.GetOrInsertPath(
Пользователь,
"preferences.ui.theme",
"dark"
);
Размер = A1sDS.GetOrInsertPath(
Пользователь,
"preferences.ui.font_size",
14
);
// Пользователь:
// {
// preferences: {
// language: "ru",
// ui: {
// theme: "dark",
// font_size: 14
// }
// }
// }
Кеш = Новый Структура();
// Первый вызов — вставит и вернёт "дефолт"
Значение1 = A1sDS.GetOrInsert(Кеш, "ключ", "дефолт");
// Значение1 = "дефолт", Кеш.ключ = "дефолт"
// Повторный вызов — вернёт существующее
Значение2 = A1sDS.GetOrInsert(Кеш, "ключ", "другое");
// Значение2 = "дефолт" (НЕ "другое")
Кеш = Новый Структура();
// Дорогая операция выполнится только один раз
Regex = A1sDS.GetOrInsertEval(
Кеш,
"rxINN",
"Новый РегулярноеВыражение(""^\d{10}(\d{2})?$"")"
);
// Повторный вызов — выражение НЕ вычисляется
Regex = A1sDS.GetOrInsertEval(
Кеш,
"rxINN",
"ДорогаяФункция()" // ← не выполнится
);
| Язык | Аналог |
|---|---|
| JavaScript | _.set(obj, 'a.b.c', value) (lodash) |
| Python | from addict import Dict; d['a']['b']['c'] = val |
| 1С | A1sDS.GetOrInsertPath(s, "a.b.c", val) |
🚀 A1sDS — это lodash для 1С!