Lodash count unique fields

I have an array of 500 objects, each object looks like this:

{name: 'Hello', phone_num: '1234'}

Now I want to find out how many each name exists. So I want to convert my array to the following:

[{name: 'Hello', count:15}, {name:'Marc', count:5}]

So, I want to think about using lodashfor this, but looking at their documentation, I could not find the answer.

They have something called countBy, but it seems that is not enough.

Can anyone help me out?

+4
source share
3 answers

groupBy(), , map() , .

var result = _(data)
  .groupBy('name')
  .map((items, name) => ({ name, count: items.length }))
  .value();

var data = [
  { name: 'Hello', phone_num: '1234'},
  { name: 'Hello', phone_num: '1234'},
  { name: 'Hello', phone_num: '1234'},
  { name: 'Hello', phone_num: '1234'},
  { name: 'Hello', phone_num: '1234'},
  { name: 'Hello', phone_num: '1234'},
  { name: 'Hello', phone_num: '1234'},
  
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  
  { name: 'Sam', phone_num: '76532'},
  { name: 'Sam', phone_num: '76532'},
  { name: 'Sam', phone_num: '76532'},
  { name: 'Sam', phone_num: '76532'}
  
];
  
var result = _(data)
  .groupBy('name')
  .map((items, name) => ({ name, count: items.length }))
  .value();
  
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.js"></script>
Hide result

UPDATE:

ES5 :

var result = _(data)
  .groupBy('name')
  .map(function(items, name) { 
     return { name: name, count: items.length };
  }).value();
+7

:

var result = _(data)
  .countBy('name')
  .map((count, name) => ({ name, count }))
  .value();
+4

You can use:

const data = [{name: 'Hello', phone:15}, {name:'Marc', phone:5}, {name: 'Hello', phone:10}];
const names = _.countBy(data, 'name');

Object.keys(names).map(x => ({name: x, count: names[x]}));

ES5 Code:

var data = [{name: 'Hello', phone:15}, {name:'Marc', phone:5}, {name: 'Hello', phone:10}];
var names = _.countBy(data, 'name');

Object.keys(names).map(function(x) {
  return {
    name: x,
    count: names[x]
  };
});

Then you can assign a call return Object.keysto var or do anything with it

+1
source

All Articles