Как перебирать объекты и классифицировать их по временным меткам в Javascript?

У меня есть массив объектов с ключами timestamp и motion. motion содержит значение, а timestamp содержит отметку времени unix. Я хочу перебрать несколько объектов и найти, какому периоду «времени дня» они соответствуют, затем я хочу суммировать значения движения для этого времени дня и сохранить все это в массиве массивов. Я хочу, чтобы продолжительность изменялась.

Скажем, это мои объекты;

 {
    timestamp: 1397160634,
    motion: 2,
    id: '534771d8c311731e21c75c9f'
 },
 {
    timestamp: 1397160634,
    motion: 3,
    id: '534771d8c311731e21c75c9f'
 }

Теперь я создаю свой массив результатов

var sampleDuration = 60; // Min
var minutesInDay = 1440;
var samplesPerDay = minutesInDay/sampleDuration;
var finalResultItem = []
for (var i = 0; i < samplesPerDay; i++) {
    var IndividualresultArray = []
    IndividualresultArray.push(60*i);
    IndividualresultArray.push(0);
    finalResultItem.push(IndividualresultArray);
}

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

Теперь я хотел бы перебрать все мои объекты и увеличить второе значение (motion) на основе диапазона времени суток, указанного в метке времени.

_forEach(objects, function (object) {
{
// grab the timestamp
// figure out which minute range it coresponds to
// increment the array value that corresponds to the minute stamp
// rinse and repeat
}

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

[[30, 5],[60, 20],[90, 5],[120, 0] .........]

или это может выглядеть так

[[000002400, 5],[000003000, 20],[000003600, 5],[000004200, 0] .........]

где первое значение — это отметка времени, которая игнорирует год, месяц и день и учитывает только время суток.

Я рассматривал возможность использования moment.js в некотором качестве, но я не уверен, как это сделать. Любая помощь с этой проблемой будет здорово.


person user379468    schedule 15.04.2014    source источник
comment
Вы сделали ошибку при создании finalResultItem? Это не в формате вашего конечного результата. Кроме того, можете ли вы уточнить, что вы хотите в качестве первого значения - учитывает только время суток? Что это за ценность? Минуты? Секунды?   -  person lebolo    schedule 15.04.2014
comment
Да, была ошибка в псевдокоде, я исправил (думаю). Первым значением каждого массива должно быть число, представляющее время суток, кроме того, что формат довольно произвольный, мне никогда не понадобится разрешение более 5 минут, поэтому min, вероятно, лучший   -  person user379468    schedule 15.04.2014


Ответы (2)


Я создал для вас jsFiddle. Логика приращения движения должна выглядеть так (здесь я использую jQuery, но вы поняли)

// Loop through and increment motion
$.each(objs, function (idx, obj) {
    var date = new Date(obj.timestamp * 1000); // Convert to milliseconds
    var minutesInDay = date.getUTCHours() * 60 + date.getUTCMinutes(); // Remove UTC for local time!
    var minuteRange = Math.floor(minutesInDay / sampleDuration);
    finalResultItem[minuteRange][1] += obj.motion;
});

РЕДАКТИРОВАТЬ: удалено некоторое обсуждение после вашего редактирования. Я также использовал более общую логику, основанную на sampleDuration.

person lebolo    schedule 15.04.2014
comment
@ user379468 Хорошо, я отредактировал, чтобы учесть ваши изменения, и сделал его более общим. Дайте мне знать, если это поможет вам на правильном пути! - person lebolo; 15.04.2014

Это должно сделать это:

_forEach(objects, function (object) {
    var date = new Date(objec.timestamp*1000);
    var minuteOfDay = date.getUTCHours()*60+date.getUTCMinutes();
    finalResultItem[minuteOfDay][1] += object.motion;
})

Для переменной частоты дискретизации используйте secondOfDay и разделите ее на sampleDuration, а затем уменьшите ее, чтобы получить индекс массива.

person Bergi    schedule 15.04.2014