2015-05-15 2 views
1

Я использую эти 3 строки, чтобы перекодировать даты из текста в некоторый формат d3 (использовать впоследствии с crossfilter & dc.js).performance on parse date format [javascript]

Я использую функции D3 для этого, но эти 3 строки замедляют мой javascript
(~ 1000 мс каждый при длине данных 10 тыс. Записей).

Я ищу более быстрые альтернативы в чистом JavaScript или jQuery.
(я бы предпочел избежать других плагинов, так как производительность поставлена ​​на карту, но любой ответ приветствуется)

Спасибо!

var formatDate = d3.time.format("%Y-%m-%d"); // ISO 2014-12-16 
var inputFormatDate = d3.time.format("%d %b %Y"); // 16 Dec 2014 

data.forEach(function (d, i) { 
    // (...) 
    d.Released = inputFormatDate.parse(d.Released); 
    d.DVD = inputFormatDate.parse(d.DVD); // e.g. Tue Dec 16 2014 00:00:00 GMT+0100 (CET) 
    d.release_date = formatDate.parse(d.release_date); 
    // (...) 
} 
+1

Что о глупом простой 'новой дате ('2014-12-16')'? – Imperative

+1

Я подготовил небольшое испытание: http://jsperf.com/parse-date-d3-vs-pure – Imperative

+0

Это может быть так просто. Я тестирую, и я вижу, что пустые даты возвращают значение null до и Недействительная дата. –

ответ

1

Анализ довольно медленный и оптимальный синтаксический анализ в значительной степени для каждой библиотеки дат, к сожалению. Моя рекомендация: если вы знаете формат, в который будет входить дата, затем получите соответствующие атрибуты с помощью String.substr, а затем используйте формат конструктора Date для new Date(year, month[, day[, hour[, minutes[, seconds[, milliseconds]]]]]) для создания объекта Date. В моих экспериментах это должно анализироваться примерно через 20% времени парсера d3.js.

+0

может быть месяцем или ножом 11? –

+0

Это должно быть 11. Поэтому вам нужно создать словарь (за пределами области действия синтаксического анализа) и использовать его для поиска Nov -> 11. –

0

В качестве примера, для RFC3339 (%Y-%m-%dT%H:%M:%SZ), который используется в golang по умолчанию, вы можете использовать

function parseDate(d) { 
    // 2015-05-13T04:01:01Z 
    return new Date(d.substr(0, 19)); 
} 

заменить

var parseDate = d3.time.format("%Y-%m-%dT%H:%M:%SZ").parse; 

Первый из них с помощью new Date() пробегов значительно быстрее, чем d3 годов функция.

Здесь поддерживаются другие форматы изначально в JavaScript: http://www.w3schools.com/js/js_date_formats.asp