Задать вопрос
@Ispanec1998

Как сделать динамическую длину ключей для обращения к объекту?

Есть объект this.data = {...}
Возможно ли динамический получить глубину вложенности в объекте?
Например мне надо получать this.data[user_list] и this.data[user][name]
Могу ли я сделать общее присвоение, чтобы не делать проверки по типу
if(args.length === 1) {
много одинакового кода со вставками this.data[args[0]] = value
}
if(args.length === 2) {
много одинакового кода со вставками this.data[args[0]][args[1]] = value
}
if(args.length === 3) {
много одинакового кода со вставками this.data[args[0]][args[1]][args[2]] = value
}


А сделать это без многократного повторения одинакового кода, где у нас меняется лишь вложенность в объекте
  • Вопрос задан
  • 143 просмотра
Подписаться 1 Простой 1 комментарий
Помогут разобраться в теме Все курсы
  • Нетология
    Fullstack-разработчик на Python + нейросети
    20 месяцев
    Далее
  • Skillfactory
    Профессия Веб-разработчик
    12 месяцев
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Как, имея массив ключей, достучаться до соответствующего им вложенного свойства:

const nested = {
  _keys: arr => arr
    .flat(Infinity)
    .flatMap(n => typeof n === 'string' ? n.split('.') : n),

  get(obj, ...args) {
    return nested._keys(args).reduce((p, c) => p?.[c], obj);
  },
  set(obj, ...args) {
    const val = args.pop();
    const keys = nested._keys(args);
    const key = keys.pop();
    return keys.reduce((p, c) => p[c] ??= {}, obj)[key] = val;
  },
};

В вашем случае применять так: nested.set(this.data, args, value);.

А вообще, ключи можно указывать в довольно-таки произвольном виде, например:

nested.get([], 'constructor.prototype', [ 'at', [[[ 'name' ]]] ], 'length') // 2
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Есть готовые модули, например, rhalff/dot-object для работы с нотацией свойств через точку:
dot.str('qna.habr.com', 'value', this.data);
/* this.data: 
{
  qna: {
    habr: {
      com: "value"
    }
  }
} */

Установка: npm install dot-object --save
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы