HTML5 Zone is brought to you in partnership with:

My name is Sagar Ganatra and I'm from Bangalore, India. I'm currently employed with Adobe India and I work there as a ColdFusion Engineer. At Adobe, I have worked on various features of ColdFusion and ColdFusion Builder. I'm very much passionate of web technologies and have a very good understanding of jQuery, Flex, HTML5, Java and of course ColdFusion. Sagar H is a DZone MVB and is not an employee of DZone and has posted 43 posts at DZone. You can read more from them at their website. View Full User Profile

Some Useful Underscore Methods

  • submit to reddit

I like jQuery and I use it in all my projects. Lately I've been looking into Design Patterns and Backbone framework. Backbone has a dependency on Underscore and more often than not, people use Underscore as a client-side templating engine when using Backbone. I was looking at the Underscore documentation and came across a bunch of useful methods.


The where method looks into the array of objects and returns only those objects that contain the specified key value pairs:

var arrayOfObjects = [
{car: 'Ford', model: 'Figo', color: 'red'}, {car: 'Honda', model: 'CRV', color: 'green'}, {car: 'Ford', model: 'EcoSport', color: 'red'} ]; _.where(arrayOfObjects, {color: 'red'});
The above would return the first and the third object in the array.


The pluck method allows you to pluck the values for the specified key. Consider the above array and when you run
_.pluck(arrayOfObjects, 'model')
this would return ['Figo', 'CRV', 'EcoSport'] i.e. all the values for the specified key.


Consider the same array again, say you want to find the number of objects with the specified key. For example, there are two 'Ford' cars and one 'Honda'. The countBy method returns you this data.
_.countBy(arrayOfObjects, function(currentObject) { return; });
This returns an object {Ford: 2, Honda: 1}


To sort an array of objects with the specified key sortBy function comes in very handy:
_.sortBy(arrayOfObjects, function(currentObject) { return currentObject.model; });
This would rearrange the array of objects alphabetically by car model.


The groupBy function is another great utility if you want to group the objects in an array by some key:
_.groupBy(arrayOfObjects, function(currentObject) { return });
This would retunrn a single object
Ford: [
{car: 'Ford', model: 'Figo', color: 'red'},
{car: 'Ford', model: 'EcoSport', color: 'red'}
Honda: [
{car: 'Honda', model: 'CRV', color: 'green'}

This utility function would just shuffle the values in the list and every time you run this method it would return you a different shuffled list
_.shuffle([1,2,3,4,5,6,7,8]); [3, 4, 8, 7, 6, 1, 2, 5]

Memoize allows you to cache the result of a function call. Say there is a function that returns the factorial of a number. If the function is called multiple times with the same value then memoize will return the cached result instead of calling the function.
var factorial = _.memoize( function(n) {     if (n == 1) return 1;     return n * factorial(n-1); }
Now on calling factorial(150) multiple times, the function is invoked only once and fetched from the cached in subsequent calls. When you look at the function definition it makes it clear that the data is returned from the cache and not by computing the result:
function (func, hasher) {     var memo = {};     hasher || (hasher = _.identity);     return function() {       var key = hasher.apply(this, arguments);       return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));     }; }

The pairs function allows you to convert an object into a array of key-value pairs:
_.pairs({'car': 'Ford', 'model': 'Figo', 'color': 'red'});
This returns a two dimensional array:
[['car','Ford'], ['model','Figo'], ['color','red']]
Although there are many other useful methods available in the Underscore library, I've listed the ones I'll be using soon in my everyday projects.
Published at DZone with permission of Sagar H Ganatra, author and DZone MVB. (source)

(Note: Opinions expressed in this article and its replies are the opinions of their respective authors and not those of DZone, Inc.)