Skip to content

Instantly share code, notes, and snippets.

@prestonp
Created February 27, 2015 23:04
Show Gist options
  • Save prestonp/851a76def41181b7ba2a to your computer and use it in GitHub Desktop.
Save prestonp/851a76def41181b7ba2a to your computer and use it in GitHub Desktop.
Count By
// count # of any object property
var getProperty = function( obj, prop ) {
if (prop.indexOf('.') < 0) return obj[prop];
var parts = prop.split('.')
, last = parts.pop()
, len = parts.length
, idx = 1
, current = parts[0];
while( (obj = obj[current]) && idx < len ) {
current = parts[idx++];
}
if ( obj )
return obj[last];
return obj;
}
var countBy = function(list, prop) {
return list.reduce(function(histogram, obj) {
var key = getProperty(obj, prop);
if ( key ) histogram[key] = histogram[key] ? histogram[key]+1 : 1;
return histogram;
}, {});
}
// Example
var orders = [
{ id: 1, user: { name: 'Sam' } }
, { id: 2, user: { name: 'Dan' } }
, { id: 3, user: { name: 'John' } }
, { id: 4, user: { name: 'Gillian' } }
, { id: 5, user: { name: 'John' } }
, { id: 6, user: { name: 'Sam' } }
];
countBy(orders, 'user.name');
// { Sam: 2, Dan: 1, John: 2, Gillian: 1 }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment