2016-05-02 13 views
1

私はいくつかのプロパティを含む項目の配列を持っています。プロパティの1つはタグの配列です。これらのアイテムで使用されているすべてのタグを取得し、それらのアイテムでそれらのタグが使用されている回数で順序付けられている最善の方法は何ですか?私はjsを強調してみようとしていますが、期待される結果は得られませんでした。私のデータのグループ数がある配列

return _.groupBy(items, 'tags'); 

例:私のタグはIDと名前が含まれています

item1 
- itemName: item1 
- tags(array): tag1, tag2 

item2 
- itemName: item2 
- tags(array): tag1, tag3 

ので、私は{tag1, 2}{tag2, 1}{tag3, 1}

アップデートのようなものを取得しようとしています。これらのIDでグループ化しようとしています

+0

「{tag1,2} {tag2,1} {tag3,1}」とは何ですか?これは有効な配列またはオブジェクトではありません。 – Phil

+0

@Philあなたは正しいです。タグが何回使用されているかを知る方法を試してみてください。私は私の質問を編集しました。 – Snapper

答えて

1

これは単純にreduce操作を使用して行うことができます。たとえば、アンダースコアを使用して

var items = [{ 
 
    itemName: 'item1', 
 
    tags: [ 
 
    {id: 'tag1', name: 'Tag 1'}, 
 
    {id: 'tag2', name: 'Tag 2'} 
 
    ] 
 
}, { 
 
    itemName: 'item2', 
 
    tags: [ 
 
    {id: 'tag1', name: 'Tag 1'}, 
 
    {id: 'tag3', name: 'Tag 3'} 
 
    ] 
 
}]; 
 

 
var tags = items.reduce((tags, item) => { 
 
    item.tags.forEach(tag => { 
 
    tags[tag.id] = tags[tag.id] || 0; 
 
    tags[tag.id]++; 
 
    }); 
 
    return tags; 
 
}, {}); 
 

 
document.write('<pre>' + JSON.stringify(tags, null, ' ') + '</pre>');

+0

このコードを実装しようとしましたが、Object {[object Object]:3}を取得しています。これは期待されていますか?私はタグごとのカウントを取得する方法がわかりません – Snapper

+1

@Snapperあなたは*どうしていますか?(うまくいけば 'alert()'経由で)? **あなたの 'items'配列はどういうものでしょうか? – Phil

+0

申し訳ありません。私のタグ配列は、私が最初に投稿したものとは少し異なります。更新されます – Snapper

3

単一の配列にマッピングされたすべてのタグ配列を、その後、countBy

var tags = _.flatten(_.map(items,d=>d.tags)) 
tags = _.countBy(tags) 

chainユーティリティ

var tags = _.chain(items).map(d=>d.tags).flatten().countBy().value(); 
+0

私は何か間違っていると思います。これを実装し、@Phil以下の他の答えと同じ結果を得ました。 Object {[object object]:3}どのようにしてタグを取得し、どれくらい頻繁に使用することができますか? – Snapper

+1

あなたのデータ構造は、私とPhilが使用したものとは異なるものでなければなりません。私は彼の答えを奇妙なものからチェックしました。私のjsfiddleを見て、同じデータを使用しているかどうかを確認してください。https://jsfiddle.net/guanzo/ppfLwhyx/1/ –

+0

コード@Eric Guanのおかげで、私の構造は私が最初に投稿した方法。更新されます。 – Snapper

0

あなたもこれを試してください:

var tagGroup = 
    items.reduce(function(p, c){ 
     c.tags.map(function(tag){  
     p[tag] = p[tag] || {count:0};   
     p[tag].count++; 
     return p; 
     }); 

     return p; 
    }, {}); 
関連する問題