Javascript как присвоить значение неопределенному объектному ключу?

#javascript #object

#javascript #объект

Вопрос:

Я хотел бы программно присвоить значения ‘еще не’ инициализированному ключу в объекте, как показано ниже:

 const a = {};
// year, month, date is a variable
a[year][month][date] = some data; 
  

Я знаю, что выше не будет работать, если я не назначу year и month перед назначением ключа даты,

но я назначаю это программно, поэтому я не могу сделать что-то вроде

 a:{
  2020:{
    10:{
      3: some data
    }
  }
}

  

вручную, как это.

Каков наилучший способ присвоить значение неопределенному ключу?

Комментарии:

1. «Какой наилучший способ присвоить значение неопределенному ключу?» -> «… если я не назначу год и месяц перед назначением ключа даты»,

Ответ №1:

Простого способа сделать это нет.

Вам нужно было бы сделать что-то вроде:

 a[year] = {}
a[year][month] = {}
a[year][month][date] = 'some data';
  

Вы могли бы использовать какую-нибудь функцию, подобную этой:

 function setByPath(obj, path, value) {
    var parts = path.split('.');
    var o = obj;
    if (parts.length > 1) {
      for (var i = 0; i < parts.length - 1; i  ) {
          if (!o[parts[i]])
              o[parts[i]] = {};
          o = o[parts[i]];
      }
    }

    o[parts[parts.length - 1]] = value;
}
  

Использование:

 setByPath(a, 'year.month.date', 'some data');
  

Пожалуйста, обратите внимание, что эта функция приведена только в качестве примера, и в некоторых случаях это может вызвать проблемы. Это для того, чтобы показать идею.

Комментарии:

1. Спасибо, я сначала подумал о назначении предыдущих ключей, как и вы, но код выглядит неопрятно, поэтому задал вопрос. Думаю, у меня нет других способов сделать это. Кстати, хотя я объявил a как const , поскольку я напрямую присваиваю свойства a , я все еще могу изменить его значение. Я думаю, вы ошибаетесь?

2. Верно, моя ошибка, я удалил этот боковой комментарий. Ofc вы можете сделать это таким образом.

Ответ №2:

Вы можете перебирать ключи без последнего для присвоения значения.

 const 
    assign = (object, [...keys], value) => {
        const last = keys.pop();
        keys.reduce((o, k) => o[k] ??= {}, object)[last] = value
    },
    a = {};

assign(a, [2020, 10, 3], 42);

console.log(a);