JavaScript: atribuir valor ao objeto da string

Introdução e isenção de responsabilidade

Algum tempo atrás, descobri que precisava de uma maneira de pegar uma string da notação de ponto contacts.name.firste construir / atualizar um objeto a partir dela.

Eu vasculhei a internet e encontrei vários métodos, nenhum dos quais fez exatamente o que eu precisava que eles fizessem; alguns apenas atualizariam um objeto existente, enquanto outros apenas criariam um novo objeto. A maioria só funcionou em alguns níveis.

Peguei o que encontrei e usei-os como referência para criar este método útil. Muito pouco desse método é puramente ideia minha, mas sim uma combinação da ajuda dos gênios que trollam o StackOverflow.

Também quero admitir que provavelmente há outras maneiras de fazer exatamente a mesma coisa, algumas podem até ser mais elegantes.

String toObject

String.prototype.toObject = function( obj, value ) {
var names = this.split('.');
// If a value is given, remove the last name and keep it for later:
var lastName = arguments.length === 2 ? names.pop() : false;
// Walk the hierarchy, creating new objects where needed.
// If the lastName was removed, then the last object is not set yet:
for( var i = 0; i < names.length; i++ ) {
obj
= obj[ names[i] ] = obj[ names[i] ] || {};
}
// If a value was given, set it to the last name:
if( lastName ) obj = obj[ lastName ] = value;
// Return the last object in the hierarchy:
return obj;
};

Uso

Usar o método é simples. Como é uma extensão do Stringobjeto javascript, você simplesmente o encadeia a partir da picada de ponto notado, assim:

var newObject = {};
'contact.name.first'.toObject(newObject, 'Josey');

Que, se você logar newObject, obterá o seguinte:

{
contact
: {
name
: {
first
: 'Josey'
}
}
}

Conclusão

Espero que isso acabe ajudando outra pessoa; Eu achei extremamente útil para coisas como atalhos para atualizar dados por meio de strings de consulta de url.