Присвоение переменной может преобразоваться в выражение (что-то, что разрешается в определенное значение, то есть что-то, что может содержать некоторая другая переменная). Код в вопросе - запутанный способ написания:
for( var i = 0; i < names.length; i++ ) {
base[ names[i] ] = base[ names[i] ] || {};
base = base[ names[i] ];
}
Он устанавливает base[names[i]]
на пустой объект, если он еще не существует, и затем он переназначает объект , на который указывает имя переменной base
на этот внутренний объект. (Внешний объект, на который изначально ссылался base
, все еще существует, но больше не существует конкретной переменной, которая ссылается на него - его все равно можно получить, используя стандартный доступ к свойству из самого внешнего объекта x
, хотя).
Если вы знакомы с методами массива, reduce
было бы более уместно и проще для чтения в этой ситуации, хотя: если аккумулятор является текущим внешним объектом, создайте внутренний объект, если он еще не существует, и верните внутренний объект в качестве нового аккумулятора на следующей итерации:
function assign(outermost, keyPath, value) {
const lastKey = keyPath.pop();
const innermostObj = keyPath.reduce((outer, prop) => {
outer[prop] = outer[prop] || {};
return outer[prop];
}, outermost)
innermostObj[lastKey] = value;
}
const settings = {};
assign(settings, ['Modules', 'Video', 'Plugin'], 'JWPlayer');
console.log(settings);