#javascript #jquery
#javascript #jquery
Вопрос:
Какой самый простой способ найти самую раннюю начальную и последнюю конечную дату из объекта ниже?
(Извините — я понимаю, что уже есть много подобных вопросов, но мои навыки JS невелики, и я не смог применить ни одно из решений к своим собственным данным. Итак, с учетом сказанного, пример кода определенно поможет мне в любых ответах — спасибо !!)
var ganttData = [
{
"id": 123456,
"name": "Sample Project",
"start": new Date(2010,11,6),
"end": new Date(2011,0,6),
"status": "Not Started",
"phase": [
{
"id": 123457,
"name": "Sample Phase",
"start": new Date(2010,11,6),
"end": new Date(2010,11,13),
"status": "Not Started",
"task": [
{
"id": 123458,
"name": "Sample Task",
"start": new Date(2010,11,6),
"end": new Date(2010,11,8),
"status": "Not Started"
}
]
},
{
"id": 123459,
"name": "Another Phase",
"start": new Date(2010,11,13),
"end": new Date(2011,0,20),
"status": "Not Started"
}
]
}
]
Комментарии:
1. Спасибо. Любой ввод относительно того, почему это не так, и что сделало бы его JSON?
2. JSON — это формат обмена текстовыми данными. В JavaScript JSON может существовать только внутри строки. См. json.org . У вас есть просто массив объектов. Объектные литералы могут выглядеть аналогично JSON, но это не одно и то же.
3. Все еще массив объектов. JSON будет, например
var json = '{"foo": "bar"}';
, который затем вам нужно будет проанализироватьJSON.parse
в объект JavaScript для доступаfoo
. Будьте осторожны, просто меняя свой вопрос. Сравнение дат в виде строк отличается от сравненияDate
объектов.4. Для целей этого проекта, я думаю, меня меньше интересует, чтобы это был JSON, чем просто возможность перебирать и получать нужные мне данные. Я разберусь с JSON позже. Сброс дат до объектов ‘Date’, чтобы упростить их анализ.
Ответ №1:
Вы могли бы просто рекурсивно перемещаться по дереву
var max = new Date(-100000000*86400000);
var min = new Date( 100000000*86400000);
function compare(key,value) {
if (key == "start" amp;amp; value < min)
min=value;
else if (key == "end" amp;amp; value > max)
max=value;
}
function traverse(obj, fun) {
for (prop in obj) {
fun.apply(this,[prop, obj[prop]]);
if (typeof(obj[prop]) == "object") {
traverse(obj[prop], fun);
}
}
}
traverse(ganttData, compare);
> max
Thu Jan 20 2011 00:00:00 GMT 0100 (W. Europe Standard Time)
> min
Mon Dec 06 2010 00:00:00 GMT 0100 (W. Europe Standard Time)
Вышесказанное работало до тех пор, пока вы не изменили start и end с a Date
на a string
. Теперь вам нужно сделать что-то вроде этого
arr = "2010,11,13".split(",");
date = new Date(arr[0], arr[1], arr[2]);
прежде чем сравнивать.
Я получил обратные минимальные и максимальные даты из ссылки на JavaScript.
Комментарии:
1. Достаточно просто, и, похоже, будет легко выполнить дополнительные проверки. Спасибо!! Огромная помощь.
Ответ №2:
function getEarliestAndLatest(ganttData) {
var earliest = ganttData.start,
latest = ganttData.end,
phase,
task;
for (var i = 0, countPhases = ganttData.phase.length; i < countPhases; i ) {
phase = ganttData.phase[i];
if (phase.start < earliest) {
earliest = phase.start;
}
if (phase.end > latest) {
latest = phase.end;
}
if (typeof phase.task !== 'undefined') {
for (var j = 0, countTasks = phase.task.length; j < countTasks; j ) {
task = phase.task[j];
if (task.start < earliest) {
earliest = task.start;
}
if (task.end > latest) {
latest = task.end;
}
}
}
}
return { earliest: earliest, latest: latest };
}