2015-07-09 4 views
0

Когда я это делаю, я получаю массив, в котором хранятся данные, сгруппированные по месяцам и дням даты, но не по году (я делаю это, чтобы получить максимальные, минимальные и средние значения за каждый день, есть данные для)Лучше, чем цепочка _.groupBy?

Проблема заключается в том, что массив хранит массив из 2-3 значений для этого дня и месяца в пределах даты, которая является ключевым значением. Эти 2-3 индекса имеют массив длиной один, который содержит ссылку на объект, который имеет фактическую точку данных (уровень), в которой я нуждаюсь. Объект содержит три атрибута: дату, id (всегда нулевую) и уровень, который является поплавком.

Мне либо нужно найти способ, чтобы те 2-3 индексы удерживали объект напрямую, либо находили способ, с помощью которого _.each может получить доступ к уровню.

Любые мысли?

var groupedData = _.groupBy(data, "date"); 

var groupedLevels = _.groupBy(groupedData, function (points, date) { 
    var dateParsed = parseDate(date); 
    var month = dateParsed.getMonth(); 
    var day = dateParsed.getDate(); 

    var monthDay = month + "-" + day; 
    return monthDay; 
}); 

_.each(groupedLevels, function (points, date) { 
    var levels = _.map(_.pluck(points, "level"), parseFloat); 

    minimum.push([ date, R.min(levels) ]); 
    maximum.push([ date, R.max(levels); 

    var averageLevel = R.sum(levels)/levels.length; 

    average.push([date, averageLevel]); 
}) 

Таким образом, данные, как есть, что первоначальный вход выглядит следующим образом (пример шт):

[ { date: "2009-01-01", 
    id: null, 
    level: "0.08", 
    }, 
    // ... 
] 

В настоящее время groupedData это:

{ "2009-01-01": 
    [ { date: "2009-01-01", 
     id: null, 
     level: "0.08" 
    } 
    ], 
    // ... 
} 

groupedLevels выглядит например,

{ "0-1": 
    [ [ { date: "2009-01-01". 
     id: null, 
     level: "0.08" 
     } 
    ], 
    // ... 
    ], 
    // ... 
} 

Я хочу пропустить все массивы длины один и просто сохранить там объект.

+1

Можете ли вы изменить свой вопрос, включив пример ввода, с которым имеете дело, и нужный результат? –

+0

да, я могу держаться – Jenny

ответ

0

Я думаю вы можете исправить сразу же вопрос, заменив строку:

var levels = _.map(_.pluck(points, "level"), parseFloat); 

С этим:

var levels = _.map(_.pluck(points[0], "level"), parseFloat); 

... но я думаю, что реальная проблема может быть, что вы» повторно делайте groupBy дважды, когда вам это не нужно. Этот сингл groupBy должны быть эквивалентны, но без дополнительного вложенного массива:

var groupedLevels = _.groupBy(data, function(item) { 
    var dateParsed = parseDate(item.date); 
    var month = dateParsed.getMonth(); 
    var day = dateParsed.getDate(); 
    return month + '-' + day; 
}); 

С этим, ваш each должен работать, как ожидалось.

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