2015-06-19 3 views
0

У меня есть требование найти сумму полей «count» для каждого типа. Есть ли способ сделать то же самое с помощью lodash или подчеркивания js. Ваша помощь очень ценится. Спасибо.Найти сумму полей массива, используя lodash или underscorejs

Входной массив

array = [ 
    { 
     type: 'weibo', 
     count: 1 
    }, 
    { 
     type: 'xing', 
     count: 1 
    }, 
    { 
     type: 'twitter', 
     count: 1 
    }, 
    { 
     type: 'twitter', 
     count: 1 
    }, 
    { 
     type: 'facebook', 
     count: 1 
    }, 
    { 
     type: 'facebook', 
     count: 1 
    }, 
    { 
     type: 'facebook', 
     count: 1 
    } 
] 

Ожидаемый результат

output = [ 
     { 
      type: 'weibo', 
      count: 1 
     }, 
     { 
      type: 'xing', 
      count: 1 
     }, 
     { 
      type: 'twitter', 
      count: 2 
     }, 
     { 
      type: 'facebook', 
      count: 3 
     } 
    ] 
+0

@RuneFS Я вижу, вы курсирующих свои товары снова ;-) –

+0

:) ну это было сделано для вещей, как это. Хотя комментарий был неправильным, потому что я, по-видимому, не могу читать и понимать в то же время сегодня ... и поиск и использования и отзывов - лучший способ улучшить, что я знаю :) –

ответ

2

Вы могли бы сделать это с _.countBy() и _.map(); обратите внимание, что из-за промежуточного преобразования в объект порядок выходного массива может быть не таким.

var array = [ 
 
    { 
 
     type: 'weibo', 
 
     count: 1 
 
    }, 
 
    { 
 
     type: 'xing', 
 
     count: 1 
 
    }, 
 
    { 
 
     type: 'twitter', 
 
     count: 1 
 
    }, 
 
    { 
 
     type: 'twitter', 
 
     count: 1 
 
    }, 
 
    { 
 
     type: 'facebook', 
 
     count: 1 
 
    }, 
 
    { 
 
     type: 'facebook', 
 
     count: 1 
 
    }, 
 
    { 
 
     type: 'facebook', 
 
     count: 1 
 
    } 
 
    ]; 
 

 
console.log(_.map(_.countBy(array, 'type'), function(value, key) { 
 
    return { 
 
    type: key, 
 
    count: value 
 
    }; 
 
}));
<script src="http://underscorejs.org/underscore.js"></script>

+0

Спасибо. это действительно помогло мне .. Большое спасибо .. – Dibish

0

Вы можете сделать это в один проход (как обычно) с _.reduce и _.values:

var sums = _(array).reduce(function(memo, e) { 
    if(!memo[e.type]) 
     memo[e.type] = { type: e.type, count: 0 }; 
    memo[e.type].count += 1; 
    return memo; 
}, { }); 
var what_you_want = _(sums).values(); 

Или, если вы хотите, чтобы пропустить _.values вызов, вы можете следить за текущих сумм в объекте (индексируется по типу) и массиве (что вы на самом деле после) и делиться ссылками между ними:

var sums = _(array).reduce(function(memo, e) { 
    if(!memo.by_type[e.type]) { 
     memo.by_type[e.type] = { type: e.type, count: 0 }; 
     memo.values.push(memo.by_type[e.type]); 
    } 
    memo.by_type[e.type].count += 1; 
    return memo; 
}, { by_type: { }, values: [ ] }); 
var what_you_want = sums.values; 

Этот последний подход гарантирует, что порядок вывода будет соответствовать порядку ввода.

Демо: https://jsfiddle.net/ambiguous/hgnz04bd/

Смежные вопросы