2010-12-14 3 views
1

日付文字列の連想配列が与えられた場合、今日またはそれ以降に最も近い次の日付を見つけるにはどうすればよいですか?日付文字列の連想配列が与えられた場合、次の最も近い日付を見つける

更新:これが結合配列の場合はどうなりますか?最も近い日付のキーを返すにはどうすればよいですか?

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" 

例えば、私は12月18日が上か、今日(12/14)の後であるので、それが7392を返すことを期待したいです。

+2

説明してください。 – Stephen

答えて

2

配列を並べ替えて、今日よりも後の日付を見つけるまで検索します。また、配列のサイズやパフォーマンス要件に応じて、バイナリ検索やその他の工夫をすることもできます。

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); 
+0

申し訳ありません - 私は* associative *配列の使用に興味があることを反映するために私の質問を更新しました –

関連する問題