Qual é a melhor maneira de obter / definir uma propriedade deep de objetos em Javascript?
É notoriamente irritante obter uma propriedade mais profunda de um objeto. Se o pai não existir, você receberá um erro. Então você precisa parar de chegar à propriedade quando um pai não existe.
A maneira sem noção de fazer isso é:
if (parent.value && parent.value.subvalue && parent.value.subvalue.targetvalue)
var myVal = parent.value.subvalue.targetvalue;
else
var myVal = null;
Quando você precisa obter uma propriedade com freqüência, isso é impraticável e você precisa de uma função de atalho. Primeiro fiz algo assim:
function getProp(path) {
try {
return eval(path);
}
catch (e) {
return null;
}
};
// getProp('parent.value.subvalue.targetvalue');
Mas isso é coxo por pelo menos duas razões: o objeto deve estar no escopo e ninguém gosta de usareval()
.
Então, talvez seja melhor aplicar o objeto à função:
function getProp(path, parent) {
path = path.split('.');
var val = parent;
for (var k = 0; k < path.length; k++) {
var key = path[k];
try {
val = val[key];
}
catch (e) {
return null;
}
}
return val;
};
// getProp('value.subvalue.targetvalue', parent);
Mas de alguma forma ainda não parece certo.
Como você faz isso? Qual é a melhor prática?
Definir uma propriedade profunda de objetos, da qual os pais podem ou não existir, é ainda mais irritante.
parent = parent || {};
parent.value = parent.value || {};
parent.value.subvalue = parent.value.subvalue || {};
parent.value.subvalue.target = "YAY SOME VALUE!"
Como você lidaria com isso bem?
Existem funções nativas de javascript para isso ainda, já que isso precisa ser feito com frequência?