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?

questionAnswers(2)

yourAnswerToTheQuestion