#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);