Underscore.js: adding safe navigation

Inspired by Bill's post on Scala: http://this-statement-is-false.blogspot.com/2009/07/safe-navigation-operators-for-scala.html

HTML

<script src="http://documentcloud.github.com/underscore/underscore.js"></script>

JavaScript

// Assume you have the following data structure
var companies = {
    orbeon: {
        cfo: "Erik",
        cto: "Alex"
    }
};

// Extend Underscore.js
_.mixin({ 
    // Safe navigation
    attr: function(obj, name) { return obj == null ? obj : obj[name]; },
    // So we can chain console.log
    log: function(obj) { console.log(obj); }
});

// Shortcut, 'cause I'm lazy
var C = _(companies).chain();

// Simple case: returns Erik
C.attr("orbeon").attr("cfo").log();
// Simple case too, no CEO in Orbeon, returns undefined
C.attr("orbeon").attr("ceo").log();
// IBM unknown, but doesn't lead to an error, returns undefined
C.attr("ibm").attr("ceo").log();