2014-12-19 3 views
1

Я хотел бы иметь массив с меткой времени как ключи и цифры в качестве значений. Таким образом, я хочу отслеживать, как много автомобилей вошли или покинули автостоянку, а также сколько автомобилей припарковали на стоянке одновременно.Javascript: Array с меткой времени как клавиши

Основа: - Получить список действий для парковки с ввести дату и дату выхода для каждой сделки - Получить все эти даты в массив с отметкой времени, как ключ и + = 1, если ввести дату и - = 1 для даты выхода - Сортировка по дате - Проходите отсортированный массив и добавить счетчик, отслеживать, если новый максимум достигается

var result = []; 
    var counter = 0; 
    var max = 0; 

    //SELECT enterTS, exitTS FROM parking; 
    // validated, that works 

    while (!rs.eof) { 
     var es = rs.fields(1).toString(); 
     var dd = rs.fields(2).toString(); 

     result[es] += 1;  //might happen at the same time with exit or other entries 
     result[dd] -= 1; 
     alert('Start' + es); //correct timestamp 
     alert('Array' + result[es]); //shows NaN 
    } 

    result.sort(); 

    for (var key in result) {    
      counter += result[key]; 

      if(counter > max){ 
       max = counter; 
      } 
    } 

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

Еще раз спасибо, FJ

ответ

3

Используйте объект, а не массив.

var result = {}; 

Теперь, чтобы заполнить его, вы можете просто:

result[es] = result[es] + 1 || 1 

И ваш for...in цикл должен работать (но вы должны использовать .hasOwnProperty ради здравомыслия в).

for (var key in result) {   
    if (result.hasOwnProperty(key)) {  
     counter += result[key]; 

     if(counter > max){ 
      max = counter; 
     } 
    } 
} 

Ваш NaN результат приходит потому, что вы делаете это:

result[es] += 1; 

Поскольку result[es] не определено (потому что вы никогда не присваивается ему значение) undefined + 1 является NaN (не число).

+1

Также проверьте, если '.hasOwnProperty' – domokun

+0

@domokun: Правда, я редактировал ответ включить это. Я не хотел путать проблему, но это стоит упомянуть. –

+0

Это не будет работать без дополнительной работы, потому что вы не можете сортировать ключи объектов. Итерация с использованием 'var key in result' не будет генерировать значения в правильном порядке. –

0

Вы не можете использовать строку в качестве индекса в массиве; это означает использование массива как объекта. Даже если бы вы могли, логика ошибочна, потому что сортировка массива сортирует значения, а не индексы.

Предлагаю создать массив объектов событий парковки и отсортировать их с помощью специальной функции сравнения. Что-то вроде этого (непроверенные):

var result = []; 
var counter = 0; 
var max = 0; 

//SELECT enterTS, exitTS FROM parking; 
// validated, that works 

while (!rs.eof) { 
    var es = rs.fields(1).toString(); 
    var dd = rs.fields(2).toString(); // I'm assuming this is the exit time 

    // create two events: one for entry and one for exit 
    result.push({time: es, change: 1}); 
    result.push({time: dd, change: -1}); 
} 

// sort based on event time 
result.sort(function(a, b){ return a.time.localeCompare(b.time); }); 

// scan events, tracking current parking population 
for (var key in result) {   
     counter += result[key].change; 

     if(counter > max){ 
      max = counter; 
     } 
} 
+0

Это, однако, не «задело» дату. Найти запись для определенной даты будет сложнее (хотя сортировка действительно помогает). ОП не предоставляет достаточного контекста для определения того, насколько это важно. –

+0

@MattBurland - В вопросе OP цель состояла в том, чтобы подсчитать, сколько было событий парковки (тривиальная проблема, так как это всего лишь количество зачисленных записей) и найти максимальное количество автомобилей, припаркованных одновременно. Если поиск по дате был важен, то понадобилась бы другая структура данных (или, что более вероятно, просто найти в базовом db, из которого были получены данные для этого алгоритма). –