2015-02-16 2 views
2

У меня есть массив, который я хочу манипулировать, потому что мне нужно использовать его в качестве источника данных для D3.js. Пример этого набора данных будет:Манипулировать массив объектов новым массивом со средним числом.

var data = [ 
{day: 1, month: 1, length: 100, year: 2010}, 
{day: 2, month: 1, length: 125, year: 2010}, 
{day: 3, month: 1, length: 150, year: 2010}, 
{day: 4, month: 1, length: 175, year: 2010}, 
{day: 1, month: 2, length: 225, year: 2010}, 
{day: 2, month: 2, length: 250, year: 2010}, 
{day: 3, month: 2, length: 325, year: 2010}, 

{day: 1, month: 1, length: 225, year: 2011}, 
{day: 1, month: 1, length: 150, year: 2011}, 
{day: 1, month: 1, length: 190, year: 2011}, 
{day: 1, month: 2, length: 210, year: 2011}, 
{day: 2, month: 2, length: 110, year: 2011}, 
{day: 3, month: 2, length: 160, year: 2011}, 
{day: 4, month: 2, length: 190, year: 2011}, 
] 

В этом случае я хочу создать новый массив, с двумя массивами, которые держат среднюю продолжительность месяца. Например:

var newData = [ [137.5, 266.7], [183.33, 167.5] ] 

Где NewData [0] [1] будет средняя продолжительность месяца 1 в 2010 году

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

data.forEach(function (el) { 
    for (var j = 0; j <= 3; j++) { 
    if (el.year === 2010 + j) { 
     for (var i = 1; i <= 2; i++) { 
       if (el.month === i) { 
        var oldLength = dataNew[j][i - 1] || 0; 
        var newLength = el.length + oldLength; 
        dataNew[j][i - 1] = newLength; 
       } 
     } 
    } 
    } 
}); 

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

+0

Так 'day' компонент исходных данных не имеет значения? Всегда ли сортируются входные данные по месяцам и годам? Откуда берутся входные данные (может быть, эта часть будет изменена для немедленного предоставления необходимого формата)? – CBroe

ответ

3

Вы можете использовать сам d3.js для облегчения вашей работы и сделать ваш код более удобочитаемым. Использование d3.nest()

var data = [ 
{day: 1, month: 1, length: 100, year: 2010}, 
{day: 2, month: 1, length: 125, year: 2010}, 
{day: 3, month: 1, length: 150, year: 2010}, 
{day: 4, month: 1, length: 175, year: 2010}, 
{day: 1, month: 2, length: 225, year: 2010}, 
{day: 2, month: 2, length: 250, year: 2010}, 
{day: 3, month: 2, length: 325, year: 2010}, 

{day: 1, month: 1, length: 225, year: 2011}, 
{day: 1, month: 1, length: 150, year: 2011}, 
{day: 1, month: 1, length: 190, year: 2011}, 
{day: 1, month: 2, length: 210, year: 2011}, 
{day: 2, month: 2, length: 110, year: 2011}, 
{day: 3, month: 2, length: 160, year: 2011}, 
{day: 4, month: 2, length: 190, year: 2011}, 
] 

var nest = d3.nest() 
    .key(function(d){return d.year}) 
    .key(function(d){return d.month}) 
    .rollup(function(d){ 
     return d3.mean(d, function(g){return g.length}); 
    }) 
    .entries(data) 

console.log(nest[0].values[0]) // 137.5 

Вот это работает fiddle

+0

Удивительный! Я не знал о функции гнезда(). Благодарю. Это будет очень полезно, когда мне придется работать с другими наборами данных. – swennemen

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