2013-05-24 2 views
1

Я работаю с underscorejs в проекте. Мне нужно делать различные типы операций массива, такие как map, reduce, filter groupby.Javascript - underscorejs map уменьшить группу по дате

Мой набор данных выглядит следующим образом:

var data_list = [ 
    {"insertDate": "2011-12-02T00:00","value": {"paisa":10000}}, 
    {"insertDate": "2013-03-02T00:00","value": {"paisa":10000} 
    },{"insertDate": "2013-03-02T00:00","value": {"paisa":10000} 
    },{"insertDate": "2012-12-02T00:00","value": {"paisa":30000}}, 
    {"insertDate": "2013-04-02T00:00","value": {"paisa":10000}, 
    },{"insertDate": "2013-04-02T00:00","value": {"paisa":30000} 
    },{"insertDate": "2013-03-02T00:00","value": {"paisa":20000}}, 
    {"insertDate": "2013-04-12T00:00","value": {"paisa":30000} 
    }, 
    {"insertDate": "2012-11-02T00:00","value": {"paisa":10000}} 
] 

Я хочу расчетными данными, основанными на день, месяц и год. Для расчета дня я делаю groupby, а затем использую карту для вычисления. Как показано ниже:

var groupedByDateData = _.groupBy(data_list, "insertDate"); 
var aggregateByDate = _.map(groupedByDateData, function(invoiceObject, createdat) { 
    return { 
    createdat: createdat, 
    val: _.reduce(invoiceObject, function(m,x) { 
     return m + x.value.paisa; 
    }, 0) 
    }; 
}); 

Его работает отлично на день карты на основе снижения, но за месяц и год расчета я хочу сделать в таком же формате, что и код читаемым.

Как я могу сделать карту, уменьшить с помощью underscorejs, так что я могу получить данные, как показано ниже: Для ежемесячного расчета:

[{"createdat": "February 2011", "val": 10000}, 
{"createdat": "March 2013", "val": 40000}, 
{"createdat": "December 2012", "val": 30000}, 
{"createdat": "April 2013", "val": 70000}, 
{"createdat": "November 2012", "val": 10000}] 

Для ежегодного MapReduce:

[{"createdat": "2011", "val": 10000}, 
{"createdat": "2013", "val": 110000}, 
{"createdat": "2012", "val": 70000}] 

Мой код JSBIN здесь

NB: Для получения ежегодного и ежемесячного сокращенного набора результатов я разделяю дату, но это не лучше всего делать. проверить мое решение здесь http://jsbin.com/etepan/3/edit

Заранее спасибо.

ответ

8

Вы хотите группировать разные вещи (время, месяц, год), поэтому ключ находится в groupBy.

Вы используете это:

var groupedByDateData = _.groupBy(data_list, "insertDate"); 

Что стенографии для:

var groupedByDateData = _.groupBy(data_list, function(item) { 
    return item.insertDate; // returns "YYYY-MM-DDT00:00" 
}); 

Изменяя эту функцию, вы можете изменить то, что вы получите группировок. К примеру, год:

var groupedByDateData = _.groupBy(data_list, function(item) { 
    // pretty crappy way of getting the year, 
    // but luckily the dates are structured 
    return item.insertDate.substring(0,4); 
}); 

// => [ 
//  {"createdat": "2011", "val": 10000}, 
//  {"createdat": "2012", "val": 40000}, 
//  {"createdat": "2013", "val": 110000} 
// ] 

Месяц:

var groupedByDateData = _.groupBy(data_list, function(item) { 
    return item.insertDate.substring(0,7); 
}); 

// => [ 
//  {"createdat": "2011-12", "val": 10000}, 
//  {"createdat": "2013-03", "val": 40000}, 
//  {"createdat": "2012-12", "val": 30000}, 
//  {"createdat": "2013-04", "val": 70000}, 
//  {"createdat": "2012-11", "val": 10000} 
// ] 

Ваш JS Bin помогло: http://jsbin.com/ucohoq/7/edit

+0

Я сделал это, прежде чем отправил проверить его здесь http://jsbin.com/etepan/3/edit, но "item.insertDate.substring (0,4);" Кажется нехорошо, я сделал то же самое, что и obj.insertDate.split ('-') [0], что тоже нечетно. – mushfiq

+0

Для синтаксического анализа даты, я обычно использую moment.js, потому что он имеет разумный API и красиво оформляет даты. Вы можете использовать его в возвращаемом значении функции 'aggregateByDate' (вместо того, чтобы выплескивать' createdat' как есть. – burin