2016-09-30 2 views
0

Я делаю запрос ajax к моему приложению ASP.NET MVC с помощью jQuery, а в обработчике «success» я получаю объект с датами в формате ISO-8601, сериализованный с использованием Json.NET :

response = { 
    FirstDate: "2001-11-11T00:00:00Z" 
    SecondDate: "2002-22-22T00:00:00Z" 
} 

После этого мне нужно вручную преобразовать все эти даты, прежде чем я могу их использовать:

var firstParsedDate = new Date(response.MyDate); 
var secondParsedDate = new Date(response.MyDate); 

есть ли способ получить объект ответа с уже разобраны даты? Если нет, их можно разобрать сразу?

+0

Как бы вы определить конкретное имущество, является ли дата или нет? JavaScript просто видит их как строки. Если вы можете понять это, вы можете сделать что-то с настройками jQuery ['ajax'] (http://api.jquery.com/jQuery.ajax/), возможно, это свойство' преобразователей', где вы можете отменить его использование 'jQuery.parseJSON'. –

+0

@MikeMcCaughan, я могу проверить все строки в ответе с использованием регулярного выражения ISO 8061. Если это преобразование можно выполнить с помощью настроек ajax, это было бы хорошим решением. –

ответ

1

Вы можете использовать jQuery's each() для выполнения функции для каждого значения.
Для демонстрационных целей я добавил toString().

response = { 
 
    FirstDate: "2001-11-11T00:00:00Z", 
 
    SecondDate: "2002-22-22T00:00:00Z" 
 
} 
 

 
$.each(response,function(i, v) { 
 
    response[i]=new Date(v).toString(); 
 
}); 
 

 
console.log(response);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


Вот альтернативный пример использования map(), что исключает недопустимые даты:

var response = { 
 
    FirstDate: "2001-11-11T00:00:00Z", 
 
    SecondDate: "2002-22-22T00:00:00Z", 
 
    ThirdDate: "1995-08-22T05:23Z", 
 
    }, 
 

 
    valid_dates = $.map(response, function(v, i) { 
 
    return Date.parse(v) ? new Date(v).toString() : null; 
 
    }); 
 

 
console.log(valid_dates);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+1

Если в ответе есть какие-либо свойства, отличные от даты, они будут установлены на недопустимый объект Date ... –

1

Вы могли бы сделать ре курсивную функцию, которая пройдет через объект ответа и автоматически преобразует любые строки, соответствующие стандарту ISO 8601, в объекты Date. Нечто подобное должно работать:

function replaceIso8601StringsWithDates(obj) 
{ 
    if (obj !== null && typeof (obj) === "object" && !Array.isArray(obj)) { 
     for (var prop in obj) { 
      if (isIso8601String(obj[prop])) { 
       obj[prop] = new Date(obj[prop]); 
      } 
      else { 
       replaceIso8601StringsWithDates(obj[prop]); 
      } 
     } 
    } 
} 

var iso8601Regex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d{1,6})?(Z|[+-]\d{2}:\d{2})$/; 
function isIso8601String(val) { 
    return typeof (val) === "string" && iso8601Regex.test(val); 
} 

Затем в success обработчиком вам просто нужно вызвать функцию:

function success(data, status, xhr) { 
    replaceIso8601StringsWithDates(data); 
    ... 
} 

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

  • Нет связанных вопросов^_^