If I understand the question correctly, and if it is to follow the order of the properties as it appears in the array (in its example it has a reversal), nothing recursive is necessary, just a loop.
See the example below, with explanations line by line as comments:
// Lista de propriedades, considerando que uma
// é filha da outra.
var arr = ['caneta', 'cor', 'hexadecimal'];
// Guarda temporariamente cada item da array
let prop;
// Estado inicial do objeto é vazio
let obj = {};
// Referencia adicional ao objeto.
// Será modificada dentro do loop.
let path = obj;
// Loop tratando os elementos da array,
// um a um, na ordem.
while (prop = arr.shift()) {
// Cria a propriedade atual
// (com valor null no último nível)
path[prop] = arr.length ? {} : null;
// Path agora será o valor da propriedade
// que acabamos de inserir.
path = path[prop];
}
// Imprime o resultado
console.log(obj);
NOTE: This code changes the original array, which is empty at the end of the loop. If you do not want this side effect, adapt it to a for(;;)
normal without using shift
, it's simple.
I created an alternative using functions of the Array
object of javascript that I particularly like:
var obj = ['cor', 'caneta', 'hexadecimal']
.concat([null]) //Remover caso não queira que o ultimo seja sempre null
.reverse()
.reduce(function(a,b){
return {[b]:a}
});
console.log(obj)
References:
Array Reduce - The method reduces () executes a reducer function (provided by you) for each member of the array, resulting in a single return value.
Array Concat - The concat () method returns a new array containing all arrays or values passed as a parameter
Array Reverse - The reverse () method reverses the items in an array. The first element of the array becomes the last and the last element becomes the first.