2016-05-02 2 views
1

У меня есть массив элементов, который содержит несколько свойств. Одним из свойств является массив тегов. Каков наилучший способ получить все теги, используемые в этих элементах, и упорядочить по количеству раз, когда эти теги используются для этих элементов? Я пытался посмотреть на подчеркивание js, но не получая ожидаемых результатов.Группа Array со счетом

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

Пример моих данных:

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

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

поэтому я стараюсь, чтобы получить что-то вроде {tag1, 2}{tag2, 1}{tag3, 1}

Update: Мой тег содержит идентификатор и имя. Я пытаюсь сгруппировать по этим идентификаторам

+0

Что такое '{tag1, 2} {tag2, 1} {tag3, 1}' должно быть? Это не допустимый массив или объект. – Phil

+0

@Phil Вы правы. Просто пытаюсь получить способ получения того, сколько раз используется тег. Я отредактировал свой вопрос. – Snapper

ответ

1

Вы можете сделать это, просто используя операцию уменьшения. Например

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

Ваша структура данных должна отличаться от той, которую я использовал Фил, b/c я проверил его ответ из любопытства. Посмотрите на мой jsfiddle и посмотрите, используем ли мы те же данные https://jsfiddle.net/guanzo/ppfLwhyx/1/ –

+0

Спасибо за код @ Эрик Гуан, заставило меня понять, что моя структура не совсем так, как я изначально размещал , Будет обновляться. – 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; 
    }, {}); 
Смежные вопросы