web-dev-qa-db-ja.com

日付の配列に対して日付を確認します

日付が配列に存在するかどうかに基づいてTRUEまたはFALSEの値を返す関数を作成しようとしています。現在私はこれを持っています:

function isInArray(value, array) {
    var a = array.indexOf(value) > -1;

    if (a == false) {
        return false; //DATE DOES NOT EXIST
    }
    else {
        return true; //DATE EXISTS IN ARRAY
    }
}

通常はforループを使用しますが、次のwhileループを使用して、開始日と終了日の間の日付のリストを生成しています。

 while (day > 0) {
     var tDate = new Date(sDate.addDays(dayCounter));
     datesArray.Push(tDate);
     day = day - 1; //DEDUCT THE DAYS AS ADDED

     var dateExists = isInArray(value, array);
     if (dateExists == false) {

     }
     else { 
         matchedDays++;
     }
     daysCounter++;
}

ただし、これは機能せず、常にFALSEを返します。これを機能させて正しい値を返すには、何をする必要がありますか?

サンプルデータ:ARRAY[26/12/2016, 27/12/2016, 28/12/2016, 29/12/2016]

[27/12/2016]で渡された値

  • 値が配列に存在する場合はTRUEを返します
  • 値が配列に存在しない場合はFALSEを返します

おそらく上記の単純な間違いです!だからこれについての助けに感謝します。また、時間はチェックされる日付に影響しますか?

8
Crezzer7

find() メソッドを使用してみてください(ecmascriptがサポートされている場合):

ケース:配列に文字列が含まれている

var array = ["26/12/2016", "27/12/2016", "28/12/2016", "29/12/2016"];
var value1 = "26/12/2016";  //exists
var value2 = "26/12/2026";  //doesn't exist

function isInArray(array, value) {
  return (array.find(item => {return item == value}) || []).length > 0;
}

console.log(isInArray(array, value1));
console.log(isInArray(array, value2));

ケース:配列にDateオブジェクトが含まれている

var array = [new Date("December 26, 2016 00:00:00"), new Date("December 27, 2016 00:00:00"), new Date("December 28, 2016 00:00:00"), new Date("December 29, 2016 00:00:00")];
var value1 = new Date("December 26, 2016 00:00:00");  //exists
var value2 = new Date("December 16, 2026 00:00:00");  //doesn't exist


function isInArray(array, value) {
  return !!array.find(item => {return item.getTime() == value.getTime()});
}

console.log(isInArray(array, value1));
console.log(isInArray(array, value2));
5
Chris

インクルード機能を使用できます。

ri = ["26/12/2016", "27/12/2016", "28/12/2016", "29/12/2016"]; 
ri.includes("20/12/2016"); //False
ri.includes("26/12/2016"); //True

IE indexOfの代わりに、値の位置を返します。

var pos = ri.indexOf("26/12/2016"); // 0
var pos = ri.indexOf("20/12/2016"); // -1
var pos = ri.indexOf("27/12/2016"); // 1


if(pos > -1){ //is in array }
1
Netzach

何かのようなもの

function isInArray(value, array) {
    for (var i = 0; i < array.length; i++) {
        if (value == array[i]) {
            return true;
        }
    }
    return false;
}

動作するはずです。ただし、異なる比較操作を使用する必要がある場合があります。

1
NotMyFaultSir

日付の最初の15文字だけを取得することで解決しました。これは、私のスニペットです。

//get the first 15 characters of each date in my array (hdates)
for (i=0;i<hdates.length;i++){
  hdates[i]=hdates[i].toString().substring(0,15); //converts dates to 15 characters long strings
}

function highlight(date) {
  if(hdates.indexOf(date.toString().substring(0,15))>-1) { //converts my date element to compare, too
       return'ok';
    } else {
       return 'ko';
    }
}

配列を変更したくない場合は、配列を複製してから、日付を15文字の長さの文字列に変換することをお勧めします。

0
Emi-C