проверка даты по массиву дат

#javascript #ecmascript-6 #ecmascript-5

#javascript #ecmascript-6 #ecmascript-5

Вопрос:

Я пытаюсь написать функцию, которая возвращает значение 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, если значение не существует в массиве

вероятно, простая ошибка выше! так что спасибо за любую помощь в этом. также повлияет ли время на дату, когда она проверяется?

Комментарии:

1. Хранится ли дата в виде строки в этом массиве?

2. Кстати, вы можете просто вернуть array.indexOf(значение) > -1. Нет необходимости делать это, если проверить else. Но отправляете ли вы оба в виде строк или?

3. Привет, теперь вы можете использовать includes .

4. дата сохраняется как элемент date в массиве

5. Как вы передаете значение для проверки? строка или объект даты?

Ответ №1:

Вы можете попробовать использовать этот 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));  


Случай: массив содержит объекты даты

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

Комментарии:

1. функция приводит к сбою приложения еще до его загрузки, похоже, ему это не нравится

2. @Crezzer7 Да, я только что понял, что вы работаете с объектами даты, а не со строками. Извините за это. Попробуйте мой обновленный ответ ниже.

3. его сбой после критической ошибки =>, и это при немедленном нажатии кнопки debug в приложении

4. ах, моя ошибка, я неправильно передавал значения!!!! это был долгий день

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

Ответ №2:

вы можете использовать функцию includes .

 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. Боюсь, это не сработает: «Объект не поддерживает свойство или метод ‘includes’

2. @Crezzer7 Я добавляю альтернативу IE. Включает в себя не работает, потому что браузер не поддерживается developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /…

3. альтернативный ответ по-прежнему возвращает постоянное значение -1 и в моем цикле while :/

Ответ №3:

Что-то вроде

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

должно сработать..
Возможно, вам придется использовать разные операции сравнения.

Ответ №4:

Я решил, получив только первые 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 символов