I have an array in the following format:
var array = [
{ id: '555weibo' },
{ id: '578weibo' },
{ id: '111facebook' },
{ id: '123facebook' },
{ id: '145facebookpage' },
{ id: '145facebookpage' },
{ id: '766facebook' },
{ id: '242facebook' },
{ id: '432twitter' },
{ id: '432exing' }
];
I need to find the number of occurrences of facebook
, twitter
, xing
, and weibo
inside that array.
eg:
{
weibo: 2,
facebook: 6,
twitter: 1,
xing: 1
}
I've searched for a solution, but nothing seems to work.
The following code doesn't give the expected result. Your help is much appreciated. Thank you.
var filtered = _.map(diff, function(value, key) {
return { id: key, count:value };
});
Here's how you could do it using lodash:
_.countBy(array, _.flow(
_.method('id.replace', /^\d+/, ''),
_.method('replace', /page$/, '')
));
map()
and so on. It takes an arbitrary number of functions as arguments. The input is filtered through each of these functions and the result is returned. This is a powerful way to compose callbacks because it's easy to rearrange/add/remove it's parts.method()
is doing the same thing here, except it's removing page
from the end of the string. Notice how there's no id
prefix since it's just being passed the result of the function in front of it.You must specify the possible keys as there's no way to guess them in the initial array.
Here's a solution, you don't need any library:
var filtered = array.reduce(function(m,v){
for (var k in m) if (~v.id.indexOf(k)) m[k]++;
return m;
},{facebook:0, weibo:0, twitter:0, xing:0});
Demonstration
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With