web-dev-qa-db-ja.com

lodashまたはunderscorejsを使用して、配列内の文字列要素の出現回数を検索します

私は次の形式の配列を持っています:

var array = [ 
  { id: '555weibo' },
  { id: '578weibo' },
  { id: '111facebook' },
  { id: '123facebook' },
  { id: '145facebookpage' },
  { id: '145facebookpage' },
  { id: '766facebook' },
  { id: '242facebook' },
  { id: '432Twitter' },
  { id: '432exing' }
 ];

その配列内のfacebookTwitterxing、およびweiboの出現回数を見つける必要があります。例えば:

{
  weibo: 2,
  facebook: 6,
  Twitter: 1,
  xing: 1
}

解決策を探しましたが、何も機能しないようです。

次のコードでは、期待した結果が得られません。あなたの助けは大歓迎です。ありがとうございました。

var filtered = _.map(diff, function(value, key) {
   return { id: key, count:value };
});
8
Dibish

アンダースコアを使用する場合:

var services = ['weibo', 'facebook', 'Twitter', 'xing'];
var result = _.map(services, function(service){ 
     var length = _.reject(array, function(el){
           return (el.id.indexOf(service) < 0); 
     }).length; 
     return {id: service, count: length};
});
4
Kris Ku

Lodashを使用してそれを行う方法は次のとおりです。

__.countBy(array, _.flow(
    _.method('id.replace', /^\d+/, ''),
    _.method('replace', /page$/, '')
));
_
  • countBy() は、カウントを値として持つオブジェクトを返します。キーは渡されたコールバックによって生成されるため、ここでカウントするキーを解析および操作できます。
  • flow() は、通常map()へのコールバックなどの関数を生成します。引数として任意の数の関数を取ります。入力はこれらの各関数でフィルタリングされ、結果が返されます。パーツの再配置/追加/削除が簡単なため、これはコールバックを作成するための強力な方法です。
  • method() は、指定されたオブジェクトで呼び出される関数を返します。ここでは、開始番号を空の文字列に置き換えます。
  • method()は、文字列の末尾からpageを削除することを除いて、ここでも同じことを行っています。 idプレフィックスがないことに注意してください。これは、その前にある関数の結果が渡されているだけだからです。
14
Adam Boduch

初期配列でそれらを推測する方法がないため、可能なキーを指定する必要があります。

これが解決策です。ライブラリは必要ありません。

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});

デモンストレーション

8
Denys Séguret