Учитывая ассоциативный массив строк Date, найдите следующую ближайшую дату - PullRequest
1 голос
/ 14 декабря 2010

Учитывая ассоциативный массив строк Date, как мне найти следующую ближайшую дату сегодня или позже?

ОБНОВЛЕНИЕ: Что, если бы это был ассоциативный массив?Как вернуть ключ на ближайшую дату?

var matchdays = {};

7386: "09/14/2010"
7387: "09/29/2010"
7388: "10/20/2010"
7389: "11/02/2010"
7390: "11/24/2010"
7391: "12/07/2010"
7392: "12/18/2010"

Например, я ожидаю, что он вернет 7392, потому что 12/18 или сегодня (12/14).

1 Ответ

2 голосов
/ 14 декабря 2010

Сортируйте ваш массив, а затем ищите, пока не найдете дату позже, чем сегодня. Вы также можете выполнить бинарный поиск или другие интересные вещи в зависимости от размера вашего массива и ваших требований к производительности.

var today = new Date();

dateList.sort();

var nextLater = null;

for (var i = 0; i < dateList.length; i++) {
  if (dateList[i] > today) {
    nextLater = dateList[i];
    break;
  }
}

Обновление

Ассоциативные массивы немного сложнее. Вы можете отсортировать ключи по датам, а затем сделать то же, что и выше, или вы можете просто пройти по одному за раз, отслеживая наименьшее положительное смещение по сравнению с сегодняшним днем. Бывший так:

// Function to get the keys
function keys(obj) {
    var keys = [];
    for (var key in obj) {
        keys.push(key);
    }
    return keys;
}

// Get the keys, then sort the keys by there associated date
var keys = keys(matchdays).sort(function(a, b) {
    var d1 = new Date(matchdays[a]);
    var d2 = new Date(matchdays[b]);

    return d1 - d2;
});

// Iterate through the keys, finding the key associated with the next date after today
var today = new Date();
var nextLater = null;

for (var i = 0; i < keys.length; i++) {
    var date = new Date(matchdays[keys[i]]);

    if (date > today) {
        nextLater = keys[i];
        break;
    }
}

alert(nextLater);

Сортировка добавляет некоторую избыточность, поскольку поиск методом грубой силы будет O (n), а сортировка в лучшем случае также будет O (n). Итак, чтобы перебор поиска, просто:

// Function to get the keys
function keys(obj) {
    var keys = [];
    for (var key in obj) {
        keys.push(key);
    }
    return keys;
}

// Get the keys
var keys = keys(matchdays);

// Iterate through the keys, finding the key associated with the next date after today
var today = new Date();
var nextLater = null;
var min;

for (var i = 0; i < keys.length; i++) {
    var date = new Date(matchdays[keys[i]]);

    var diff = date - today;

    if (diff > 0 && (min == undefined || diff < min ) {
        min = diff
        nextLater = keys[i];
    }
}

alert(nextLater);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...