2013-05-22 3 views
1

Я работаю над приложением, которое мне нужно сделать для группировки различных наборов объектов javascript, и они будут основаны на месяце, день и год.Объектная группа Javascript по дням, месяцам, годам

За день я делаю, как показано ниже

var calculateByDay = function(inputList){ 
     var outPutList = [];  
     var result = {} 
     var item = null, key = null; 
     for(i=0; c<inputList.length; i++) { 
      item=inputList[c]; 
      key = Object.keys(item)[0]; 
      item=item[key]; 
      if(!result[key]) { 
       result[key] = item; 
      } 
      else { 
      result[key] += item; 
     } 
     for (r in result) 
      { 
       var docs = {}; 
       docs["date"] = r; 
       docs["amount"] = result[r]; 
       outPutList.push(docs); 
      } 

     } 
     return outPutList; 
    } 

Как я могу улучшить выше код и использовать его в течение месяца и года расчета также? Я пошел тщательным underscore.js и имеет метод groupBy. но, похоже, не соответствует моему требованию. Я хочу группу месяцев и год также, для

var inputList = [{"2012-12-02T00:00": 2000}, {"2013-01-01T00:00": 1200},{"2013-02-02T00:00": 550}, {"2013-02-02T00:00": 1000}]; 

Вывод должен быть:

Monthly : 
[{"December 2012": 2000}, {"January 2013": 1200},{"February 2013": 1550}]; 
Yearly 
[{"year 2012": 2000}, {"year 2013": 2750}]; 

И, кажется, мне нужен такого рода карты, уменьшить подход для больших объемов данных (массив наборы), есть ли какая-либо другая библиотека или методы, которые я могу сделать, чтобы сделать код надежным?

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

ответ

2

Пожалуйста, смотрите, если следующий рефакторинг полезна для вас http://jsfiddle.net/wkUJC/

var dates = [{"2012-12-02T00:00": 2000}, {"2013-01-01T00:00": 1200},{"2013-02-02T00:00": 550}, {"2013-02-02T00:00": 1000}]; 

function calc(dates) { 
    var response = {}; 
    dates.forEach(function(d){ 
     for (var k in d) { 
      var _ = k.split("-"); 
      var year = _[0] 
      var month = _[1] 
      if (!response[year]) response[year] = {total: 0} 
      response[year][month] = response[year][month] ? response[year][month]+d[k] : d[k] 
      response[year].total+= d[k] 
     } 
    }); 
    console.log(response); 
    return response; 
} 

calc(dates); 
+0

Спасибо, btw Мне нужен ответ в массиве. – arnold

12

Учитывая несколько иную структуру данных:

var data = [{ 
    "date": "2011-12-02T00:00", 
    "value": 1000 
}, { 
    "date": "2013-03-02T00:00", 
    "value": 1000 
}, { 
    "date": "2013-03-02T00:00", 
    "value": 500 
}, { 
    "date": "2012-12-02T00:00", 
    "value": 200 
}, { 
    "date": "2013-04-02T00:00", 
    "value": 200 
}, { 
    "date": "2013-04-02T00:00", 
    "value": 500 
}, { 
    "date": "2013-03-02T00:00", 
    "value": 500 
}, { 
    "date": "2013-04-12T00:00", 
    "value": 1000 
}, { 
    "date": "2012-11-02T00:00", 
    "value": 600 
}]; 

Вы можете использовать подчеркивание:

var grouped = _.groupBy(data, function(item) { 
    return item.date; 
}); 

var groupedByYear = _.groupBy(data, function(item) { 
    return item.date.substring(0,4); 
}); 

var groupedByMonth = _.groupBy(data, function(item) { 
    return item.date.substring(0,7); 
}); 

console.log(groupedByYear); 

См. Соответствующий ответ: Javascript - underscorejs map reduce groupby based on date

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