UndescoreJS - конвертировать свойства объекта в массивы

0

Случай прост - у меня есть список объектов:

[
{"id":"0001","status":"prod"},  
{"id":"0002","status":"prod"},  
{"id":"0003","status":"prod"},  
{"id":"0004","status":"prod"},  
{"id":"0005","status":"dev"},  
{"id":"0006","status":"dev"}
]

когда я пользователь _.groupBy('status'), результатом будет:

{
    prod: [{"id":"0001","status":"prod"},  
        {"id":"0002","status":"prod"},  
        {"id":"0003","status":"prod"},  
        {"id":"0004","status":"prod"}],
    dev: [{"id":"0005","status":"dev"},  
        {"id":"0006","status":"dev"}]
}

Но мне нужен результат, подобный приведенному ниже коду, чтобы отправить Chart.js (используя Underscorejs):

{
    legend: ['prod','dev'],
    data: [4,2]  // Array Length  
}

Как я могу использовать Underscore.js для решения моей проблемы?

Теги:
chart.js
underscore.js

3 ответа

3
Лучший ответ

В одной цепочке, просто для удовольствия.

_.chain(data)
  .groupBy('status')
  .mapObject(x => x.length)
  .pairs()
  .unzip()
  .zip(['legend', 'data'])
  .map(x => x.reverse())
  .object()
  .value();
0
var legend = _.uniq(_.pluck(data, 'status'));
var groupedData = _.groupBy(data, 'status');

var result = {
    legend: legend,
    data: _.map(legend, function(status) {
        return groupedData[status].length;
    })
};
0

Просто нужен еще один шаг:

 var output = {
     legend: [],
     data: []
 }
 _.chain(rawData).groupBy('status').each(function(value,key){
       output.legend.push(key);
       output.legend.push(data.length);
 })

Ещё вопросы

Сообщество Overcoder
Наверх
Меню