Если вы хотите проверить существование значения только по определенному пути, вам нужно использовать только lodash#has
.Использование lodash#get
приведет к получению значения определенного свойства из определенного пути, но использование такого значения для проверки существования такого пути ненадежно, поскольку это значение может быть ложным.
Кроме того,Аргумент пути, принятый как lodash#has
, так и lodash#get
, принимает либо строку, либо массив, поэтому вам на самом деле не нужно объединять их из разделителя.Фактически, присоединение к нему таким способом завершается неудачно, когда одно из ваших свойств конфигурации содержит массив.Поскольку запись ключа массива заключена в скобки, например [0]
или [1]
.
function initialize(appConfig) {
const walkConfig = (config, paths = []) => {
Object.entries(config).forEach(([key, value]) => {
let $paths = paths.concat(key);
if(!_.has(appConfig, $paths)) {
throw new Error(`Config was missing: ${$paths.join('.')}`);
}
if(_.isObject(value)) {
walkConfig(value, $paths);
}
});
};
walkConfig(unsetConfig);
}
const { _ } = window;
const UNSET_CONFIG_VAR = 'UNSET'
let config = {
logging: {
hasConsole: UNSET_CONFIG_VAR,
hasSyslog: UNSET_CONFIG_VAR,
processName: UNSET_CONFIG_VAR,
inner: {
test: UNSET_CONFIG_VAR
}
}
}
const unsetConfig = _.cloneDeep(config); // Clone inner objects as well
function initialize(appConfig) {
const walkConfig = (config, paths = []) => {
Object.entries(config).forEach(([key, value]) => {
let $paths = paths.concat(key);
if(!_.has(appConfig, $paths)) {
throw new Error(`Config was missing: ${$paths.join('.')}`);
}
if(_.isObject(value)) {
walkConfig(value, $paths);
}
});
};
walkConfig(unsetConfig);
}
initialize({
logging: {
hasConsole: false,
hasSyslog: true,
processName: true,
inner: {
as: true
}
}
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>