Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Pattern to avoid long dot-notation chains

Tags:

javascript

When accessing nested objects using dot notation, I always have to make sure that the previous object exists, which gets pretty exhausting.

I basically want to avoid long if chains like

if (a && a.b && a.b.c && a.b.c[0] ... ) { v = a.b.c[0]; }

The only other thing I can think of is via the use of a try catch.

var v; try { v = a.b.c[0].d.e; } catch (e) {}

Is there a better pattern for this?


1 Answers

I think you've got the two prettiest solutions already.

But note that for something like, say, obj.obj.string.length your first solution will fail if string === "". Since an empty string is falsey, it'll trip the && guard.

But speaking of strings, you could do something like:

function getNestedProperty(obj, propChain) {
    var props = propChain.slice(0), prop = props.shift();
    if(typeof obj[prop] !== "undefined") {
        if(props.length) {
            return getNestedProperty(obj[prop], props);
        } else {
            return obj[prop];
        }
    }
}

var v = getNestedProperty(a, ["b", "c", 0, "d", "e"]);

Yeah... not too pretty :P

I'd say that, of the solutions proposed, try...catch is probably the simplest way to go

like image 66
Flambino Avatar answered Sep 12 '25 14:09

Flambino