2015-12-09 2 views
1

Насколько я знаю, в Underscore.js, мы можем использовать groupBy функция. Синтаксис:Как сделать groupBy, фильтровать и подсчитывать вместе в Underscore.js?

_.groupBy(list, iteratee, [context]) 

Например, мы делаем: _.groupBy(['one', 'two', 'three'], 'length');

Тогда результат: {3: ["one", "two"], 5: ["three"]}

Как вы можете видеть, результат содержит 2 набора. Теперь я хочу: получить критерии, используемые для группировки, и общее количество элементов в каждом наборе.

Таким образом, результат должен быть: {3: 2, 5: 1}. Потому что набор 3 имеет 2 элемента, а набор 5 имеет 1 элемент.

Я могу легко сделать это в LINQ, используя Select и Count. Но я не знаю, как это сделать в Underscore.js.

Благодарим за помощь.

ответ

1

Вы можете использовать _.countBy method:

_.countBy(['one', 'two', 'three'], 'length'); 
// {3: 2, 5: 1} 

Из документов, это соответствует тому, что вы пытаетесь достичь:

Сортирует список по группам и возвращает количество для количества объектов в каждая группа. Подобно groupBy, но вместо того, чтобы возвращать список значений , возвращается счетчик для количества значений в этой группе.

+0

Спасибо, это именно то, что я ищу :) – AnhTriet

0

Если я правильно понял вопрос правильно, это должно работать:

_.each(
    _.groupBy(['one','two','three'],'length'), 
    function(x,y,z){ 
    z[y]=x.length; 
    } 
); 
+0

'_.groupBy' возвращает объект вместо' Array'. Поэтому 'map' не будет работать. – PSWai

+0

О, крики. Извините, исправится. –

0

Вы можете использовать _.mapObject().

var grouped = _.groupBy(['one', 'two', 'three'], 'length'); 
var result = _.mapObject(grouped, function(items) { 
    return items.length; 
}); // {3: 2, 5: 1} 
Смежные вопросы