2017-12-15 16 views
0

に私のようであるという問題があるすべての見つからない場合は、最寄りの日付を選択:こんにちはジャバスクリプト

問題:私は日付の配列を持っていると日付のいくつかは、例えば不足しているが。 ['10-Mar-2017','11-Mar-2017','12-Mar-2017','14-Mar-2017','14-Mar-2017','15-Mar-2017','16-Mar-2017','17-Mar-2017','19-Mar-2017','23-Mar-2017','25-Mar-2017','26-Mar-2017','27-Mar-2017']

スムーズに動作しているフロントエンドの日付を強調したいのですが、配列で範囲が使用可能な場合にのみ機能します。例えば、私は13-Mar-2017を強調表示するように選択しましたこれはうまくいきませんでした。 13が利用できない場合のように、最も近い日付をとると、それは14-Mar-2017を強調表示する必要があります。これは私が試みたものです。

、ソリューションをしようとしました:

min_date = getFormattedDate(dates.min); 
max_date = getFormattedDate(dates.max); 
temp_date=new Date(min_date); 

for (index=0; index < graphData.graph_data.length; index++){ 
    date = new Date(getFormattedDate(graphData.graph_data[index].date)); 

    if (temp_date == date) { 
    min_date=getFormattedDate(temp_date); 

    } else { 
    temp_date = (new Date(temp_date).addDays(1)); 
    } 
} 

getFormattedDateは、所望の出力形式の日付を行った後、私に文字列を渡す私の関数です。

+0

は、あなたが強調表示したいですか? – xs0

+0

@ xs0実際には問題ではありませんが、 '13-Mar-2017'から' 201-Mar-2017 to 17-Mar-2017'の日付を取得したいと仮定します。 –

+0

https://www.npmjs.com/package/nearest-date – jkordas

答えて

0

getTime()を使用して、1970/01/01からのミリ秒数を表す数値を取得し、2つの日付間の距離を比較できます。このように:

var dates = ['10-Mar-2017','11-Mar-2017','12-Mar-2017','14-Mar-2017','14-Mar-2017','15-Mar-2017','16-Mar-2017','17-Mar-2017','19-Mar-2017','23-Mar-2017','25-Mar-2017','26-Mar-2017','27-Mar-2017']; 
 

 
function getClosestDate(myDate, dates){ 
 
    var distances = []; 
 
    var option = new Date(myDate); 
 
    for(let i = 0; i < dates.length; i++) 
 
    { 
 
     distances[i] = { index: i, 
 
         distance: Math.abs(new Date(dates[i]).getTime() -         option.getTime()), 
 
         value: new Date(dates[i]).getTime() 
 
     }; 
 
    } 
 

 
    distances.sort((a,b) => a.distance - b.distance); 
 
    var smallestDistance = distances[0].distance; 
 
    //now get the greater date in same distances 
 
    distances = distances.filter((v) => v.distance == smallestDistance); 
 
    distances.sort((a,b) => b.value - a.value); 
 

 
    return dates[distances[0].index]; 
 
} 
 
console.log(getClosestDate('13-Mar-2017', dates));

0

temp_date日付ので、Dateオブジェクトです:

temp_date == date 

は常にfalseと評価されます。

日付の解析、書式設定、および増分の方法に関する多くの情報を除外しているので、それらの簡単なバージョンを含めました。

解析後の日付として文字列を比較できますが、組み込みパーサーには依存しないでください。欠落している日付については、次に高い日付に移動したいと思われるので、次のようにします。もしあなたが最も近い日付を望むなら、あなたは次の最高と最低の次に行くためにもう少し論理が必要です、そして、あなたが望むものを選んでください。

以下は一致する日付を検索し、見つかった場合はそれを返します。それ以外の場合は、次に高い日付を探します。範囲を超えている場合は、メッセージを返します。下限も含めることができます。

これは完全な解決策ではありませんが、これをどのように実行するかの例です。日付

// Setup functions to parse, format and increment Dates 
 
Date.prototype.addDays = function(days) { 
 
    this.setDate(this.getDate() + days); 
 
    return this; 
 
} 
 

 
Date.prototype.formatDate = function(){ 
 
    var months = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '); 
 
    return ('0'+this.getDate()).slice(-2) + '-' + months[this.getMonth()] + '-' + this.getFullYear(); 
 
} 
 

 
Date.parseF = function(s) { 
 
    var months = 'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split(' '); 
 
    var b = s.split('-'); 
 
    return new Date(b[2], months.indexOf(b[1]), b[0]); 
 
} 
 

 
// Data 
 
var dates = ['12-Mar-2017','14-Mar-2017']; 
 

 
// Get matching date or next highest 
 
function getNearest(s, data) { 
 
    // Set limits for search 
 
    var min = Date.parseF(s); 
 
    var max = Date.parseF(data[data.length - 1]); 
 

 
    do { 
 
    // Search for match 
 
    var idx = data.indexOf(s); 
 
    // If found, return s 
 
    if (idx >= 0) return s; 
 
    // Otherwise, increment date and search again 
 
    min.addDays(1); 
 
    s = min.formatDate(); 
 
    } while (min <= max) 
 
    return 'Outside range'; 
 
} 
 

 
// Tests 
 
['12-Mar-2017','13-Mar-2017','14-Mar-2017','15-Mar-2017'].forEach(function(s) { 
 
    console.log(s + ': ' + getNearest(s, dates)); 
 
});

+0

お返事ありがとうございます。お早めにaddDays関数に返信して申し訳ありませんが、それについて言及していないと申し訳ありません。私は日付を分割する必要はありません任意のソリューションです。 ? –

+1

@ fatpotato - あなたは文字列を解析する必要があります、ライブラリを使用するか、独自の関数を書くことができます。それを組み込みのパーサーに任せないでください。予期しない不便な時間にあなたを失墜させます。 – RobG

+0

私は自分自身の関数と指定された配列内の日付を見つけるステータスをチェックするフラグを使ってこれを行いました。 –