Js перебор свойств объекта и заполнение допустимыми значениями

Рейтинг: 0Ответов: 0Опубликовано: 04.04.2023

Всем привет!

Есть объект, который содержит шаблон настроек:

/**
 * 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.: В будущем, конфиг может расширяться и углубляться.

Ответы

Ответов пока нет.