#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 символов