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.first
e 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 String
objeto 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.