Js перебор свойств объекта и заполнение допустимыми значениями
Всем привет!
Есть объект, который содержит шаблон настроек:
/**
* rate:
* - true - пользователь может задавать любое значение
* - false - пользователь не может задавать значение
* - deny - пользователь может задавать значения, кроме тех, которые в массиве val
* - allow - пользователь может задавать только те значения, которые в массиве val
*
* type - тип значения (строка, ссылка, чекбокс)
*/
let config = {
tplFileUrl: {
rate: true,
type: 'link',
},
projectName: {
rate: true,
type: 'string',
},
slideNumber: {
rate: 'deny',
type: 'string',
val: ['Случайный', 'По номеру теста'],
},
userAnswer: {
creditedAnswer: {
rate: 'allow',
val: ['Последний'],
},
},
attestation: {
minResult: {
rate: 'allow',
type: 'string',
val: ['Любой'],
},
},
tplMail: {
success: {
subject: {
rate: 'allow',
type: 'string',
val: ['Тема письма'],
},
body: {
rate: 'allow',
type: 'string',
val: ['Тело письма']
},
},
fail: {
subject: {
rate: 'allow',
type: 'string',
val: ['Тема письма']
},
body: {
rate: 'allow',
type: 'string',
val: ['Тело письма']
},
},
},
};
Пользовательские настройки получаем в таком виде:
let userSetup = {
'general.tplFileUrl': 'https://mail.ru/',
'general.projectName': 'Знчение',
'general.slideNumber': 'Случайный',
'userAnswer.creditedAnswer': 'Последний',
'attestation.minResult': 'Любой',
'tplMail.success.subject': 'Тема письма',
'tplMail.success.body': 'Письмо',
'tplMail.fail.subject': 'Тема письма',
'tplMail.fail.body': 'Письмо',
};
Нужно создать объект по шаблону 'config' (пройтись по этому объекту) и заполнить его значениями из 'userSetup'. Параллельно сделать проверку значений пользователя.
Написал вот такую функцию для перебора объекта.
// Заполняет конфиг
function setConfig(obj) {
// Если объект содержит свойство rate занчит это финальный объект
if (obj.hasOwnProperty('rate')) {
/**
* ВОПРОС: Как мне здесть, получить "путь" к этому свойству
* в объекте, чтобы по нему построить ключ, и взять значение
* из 'userSetup'?
* Или может, как-то под ругому можно добраться до знчения из 'userSetup'?
*/
// Получаем значение из userSetup
let userVal = 'Значение';
// Возвращаем значение
return userVal;
} else if (obj != null && typeof obj === 'object' && !Array.isArray(obj)) {
let res = {};
for (let k in obj) {
res[k] = setConfig(obj[k]);
}
return res;
}
}
let config = setConfig(config);
console.log(config);
Главный вопрос, как добраться до пользовательского значения из 'userSetup' изнутри этой функции?
P.S.: В будущем, конфиг может расширяться и углубляться.
Источник: Stack Overflow на русском