2016-04-24 5 views
-1

У меня есть массив строк scheduleDates:JavaScript forEach. Строковые элементы на сегодняшний день

0:"24.04.2016, 11:53" 
1:"12.04.2016, 10:07" 
2:"13.04.2016, 9:45" 

Мне нужно заменить струнные элементов для Даты типа в одном массиве.

Я пробовал:

scheduleDates.forEach(function (date) { 
    var currDate = date.split(', ')[0]; 
    var currTime = date.split(', ')[1]; 
    var hours = currTime.split(':')[0]; 
    var minutes = currTime.split(':')[1]; 
    var year = currDate.split('.')[2]; 
    var month = currDate.split('.')[1]; 
    var day = currDate.split('.')[0]; 
    var newDate = new Date(year, month, day, hours, minutes); 
    date = newDate; 
}); 

Это не работает

ответ

0
var scheduleDates = ["24.04.2016, 11:53","12.04.2016, 10:07","13.04.2016, 9:45"]; 

scheduleDates = scheduleDates.map(function (date) { 
    var currDate = date.split(', ')[0]; 
    var currTime = date.split(', ')[1]; 
    var hours = currTime.split(':')[0]; 
    var minutes = currTime.split(':')[1]; 
    var year = currDate.split('.')[2]; 
    var month = currDate.split('.')[1]; 
    var day = currDate.split('.')[0]; 
    return new Date(year, month-1, day, hours, minutes); 
}); 
+0

Он работает в Chrome, но по ошибке IE - недопустимая дата. – endovitskiiy

+0

еще недействительный Дата – endovitskiiy

+0

Это должно сработать. Обратите внимание на месяц-1 –

0

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

Уродливое исправление заключается в присвоении нового значения правильному индексу. Это немного взломанный, и вообще не то, для чего предназначен forEach.

scheduleDates.forEach(function (date, index) { 
    var currDate = date.split(', ')[0]; 
    var currTime = date.split(', ')[1]; 
    var hours = currTime.split(':')[0]; 
    var minutes = currTime.split(':')[1]; 
    var year = currDate.split('.')[2]; 
    var month = currDate.split('.')[1]; 
    var day = currDate.split('.')[0]; 
    var newDate = new Date(year, month, day, hours, minutes); 

    scheduleDates[index] = newDate; 
}); 

Вы можете использовать вместо map и присвоить полученный массив обратно в переменную.

scheduleDates = scheduleDates.map(function (date) { 
    // ... 

    return newDate; 
}); 

Оставьте свою собственную разрушительную карту, чтобы сделать вещи немного легче.

function mapd (array, block) { 
    var length = array.length; 

    for (var i = 0; i < length; i++) { 
    array[i] = block(array[i], i); 
    } 
} 

mapd(scheduleDates, function (date) { 
    // ... 

    return newDate; 
}); 
0

Прежде всего, вы должны использовать карту вместо Foreach. Это лучше подходит для вашей цели.

Вот что я хотел бы сделать (следуя ваши первоначальные мысли):

function toDateObject(date) { 
    var currDate = date.split(', ')[0]; 
    var currTime = date.split(', ')[1]; 
    var hours = currTime.split(':')[0]; 
    var minutes = currTime.split(':')[1]; 
    var year = currDate.split('.')[2]; 
    var month = currDate.split('.')[1]; 
    var day = currDate.split('.')[0]; 
    return new Date(year, month, day, hours, minutes); 
} 

var scheduleDates = ["24.04.2016, 11:53","12.04.2016, 10:07","13.04.2016, 9:45"].map(toDateObject); 

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

В этом случае он получает массив строк, применяет функцию toDateObject к каждому из них, а затем возвращает новый массив результатов вызова этой функции.

Подробнее об этом здесь: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

Смежные вопросы