33

Possible Duplicate:
array_count_values for javascript instead

Let's say I have simple JavaScript array like the following:

var array = ['Car', 'Car', 'Truck', 'Boat', 'Truck'];

I want to group and count of each so I would expect a key/value map of:

{
  Car   : 2,
  Truck : 2,
  Boat  : 1
}
0

2 Answers 2

59
var arr = [ 'Car', 'Car', 'Truck', 'Boat', 'Truck' ];
var hist = {};
arr.map( function (a) { if (a in hist) hist[a] ++; else hist[a] = 1; } );
console.log(hist);

results in

{ Car: 2, Truck: 2, Boat: 1 }

This works, too:

hist = arr.reduce( function (prev, item) { 
  if ( item in prev ) prev[item] ++; 
  else prev[item] = 1; 
  return prev; 
}, {} );
Sign up to request clarification or add additional context in comments.

6 Comments

first solution doesn't work for values that are not compatible with variable names like GUID or integers, though it is great
Just a note, according to developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… map creates a copy of the array. In your case you're not even using that copy, so it will be better to doe is like so: arr.forEach(function (a) { if (a in hist) hist[a] ++; else hist[a] = 1; }) because forEach will not create a new copy
If you are using Undescore, instead of arr.reduce you can also try _.countBy(list, iterator) underscorejs.org/#countBy
thanks for exampla of creating dict out of array with reduce
You should use Array.prototype.forEach() instead of Array.prototype.map() in your first solution.
|
6

You can loop through each index and save it in a dictionary and increment it when every that key is found.

count = {};
for(a in array){
  if(count[array[a]])count[array[a]]++;
  else count[array[a]]=1;
}

Output will be:

Boat: 1
Car: 2
Truck: 2

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.