Over a million developers have joined DZone.
Platinum Partner

Some Useful Underscore Methods

· Web Dev Zone

The Web Dev Zone is brought to you in partnership with Mendix. Download this Forrester Report to gain a better understanding of the low-code platform market and how to make a strategic platform selection you won’t regret.

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 currentObject.car; });
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 currentObject.car });
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.

The Web Dev Zone is brought to you in partnership with Mendix. Better understand the aPaaS landscape and how the right platform can accelerate your software delivery cadence and capacity with the Gartner 2015 Magic Quadrant for Enterprise Application Platform as a Service.


Published at DZone with permission of Sagar H Ganatra , DZone MVB .

Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}