34

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
}
Community
  • 1
  • 1
aherrick
  • 19,799
  • 33
  • 112
  • 188

3 Answers3

60
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; 
}, {} );
Rudolf Mühlbauer
  • 2,511
  • 16
  • 18
  • first solution doesn't work for values that are not compatible with variable names like GUID or integers, though it is great – Kat Lim Ruiz May 30 '14 at 06:08
  • 9
    Just a note, according to https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map 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 – ludo Aug 14 '14 at 22:16
  • 1
    If you are using Undescore, instead of `arr.reduce` you can also try _.countBy(list, iterator) http://underscorejs.org/#countBy – Ande Aug 20 '14 at 17:35
  • thanks for exampla of creating dict out of array with reduce – blazkovicz May 19 '15 at 10:51
  • You should use `Array.prototype.forEach()` instead of `Array.prototype.map()` in your first solution. – Daniel Jul 13 '16 at 20:41
  • Can tidy it up with arr.map((a) => a in hist ? hist[a] ++ : hist[a] = 1); – chri3g91 Jan 02 '20 at 18:52
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
Shubhanshu Mishra
  • 6,210
  • 6
  • 21
  • 23
0

You can achieve the desired output using the reduce method in JavaScript. The reduce method is used to accumulate values while iterating through an array. Here's how you can use the reduce method to group and count the elements in the input array.

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

let frequencyMap = array.reduce((map, item) => {
  if (!map[item]) {
    map[item] = 1;
  } else {
    map[item]++;
  }
  return map;
}, {});

console.log(frequencyMap);