2014-08-29 7 views
3

Я получаю некоторое нечетное поведение от функции гнезда D3.js, кажется, что ключ и rollup преобразуют test_date из объекта Date в строку.D3 Дата форматирования D3 неверно

Вот мой код:

var data = [{ 
    "test_type": "x1", 
    "test_date": "2014-07-15" 
}, { 
    "test_type": "x3", 
    "test_date": "2014-07-16" 
}, { 
    "test_type": "x2", 
    "test_date": "2014-07-27" 
}, { 
    "test_type": "x1", 
    "test_date": "2014-07-28" 
}]; 

var parseDate = d3.time.format("%Y-%m-%d").parse; 


data.forEach(function(d) { 
    d.test_date = parseDate(d.test_date); 
}); 

var result = d3.nest() 
    .key(function(d) { 
     return d.test_type; 
    }) 
    .key(function(d) { 
     return d.test_date; 
    }) 
    .rollup(function(leaves) { 
     return leaves.length; 
    }) 
    .entries(data); 

И результат:

[{ 
    "key": "x1", 
    "values": [{ 
     "key": "Tue Jul 15 2014 00:00:00 GMT-0600 (Mountain Daylight Time)", 
     "values": 1 
    }, { 
     "key": "Mon Jul 28 2014 00:00:00 GMT-0600 (Mountain Daylight Time)", 
     "values": 1 
    }] 
}, { 
    "key": "x3", 
    "values": [{ 
     "key": "Wed Jul 16 2014 00:00:00 GMT-0600 (Mountain Daylight Time)", 
     "values": 1 
    }] 
}, { 
    "key": "x2", 
    "values": [{ 
     "key": "Sun Jul 27 2014 00:00:00 GMT-0600 (Mountain Daylight Time)", 
     "values": 1 
    }] 
}] 

мне нужно вложенное значение ключа быть дата объекта не является строкой. Кто-нибудь знает, что может вызвать это?

Вот jsfiddle с проблемой http://jsfiddle.net/2ryahc9L/1/

+0

Я боюсь, что это не «неправильное» поведение - так определяется метод, [ключи всегда обрабатываются как строки] (https://github.com/mbostock/d3/ wiki/Arrays # nest_key) (то же, что и для объекта Javascript или хэш-карты d3.map, которые используются внутри для создания гнезда). Обычно я предлагаю просто получить исходное значение данных из первой записи в вашем массиве значений, но функция rollup удаляет эту опцию. Это не идеально, но вы должны иметь возможность принуждать строку к дате без потери данных. – AmeliaBR

+0

Благодарим за отзыв. Это то, что я закончил делать. –

ответ

3

Функция (и объекта) d3.time.format работы двумя способами:

  • d3.time.format('%Y-%m-%d').parse('2014-08-29') возвратит Date объект. Он использует формат, чтобы знать, как интерпретировать строку, указанную в качестве аргумента.
  • d3.time.format('%Y-%m-%d')(new Date(2014, 7, 29)) вернет строку, отформатированную как 2014-08-29'.

Кроме того, ключи в d3.nest всегда будут привязаны к строкам. Вам нужно будет объединить обе формы, чтобы добиться желаемого поведения. С уважением.

0

Я нашел решение, которое действительно сработало для меня. У меня была аналогичная проблема. Я хотел бы вставить данные с меткой времени в качестве ключа. AmeliaBR написал, что клавиши являются строками. Но я хотел бы использовать ключ как объект, потому что он должен быть осью x моей диаграммы.

var data = [{ 
    "test_type": "x1", 
    "test_date": "2014-07-15" 
}, { 
    "test_type": "x3", 
    "test_date": "2014-07-16" 
}, { 
    "test_type": "x2", 
    "test_date": "2014-07-27" 
}, { 
    "test_type": "x1", 
    "test_date": "2014-07-15" 
}]; 

var parseDate = d3.time.format("%Y-%m-%d").parse; 

Я использую еще одно поле для даты только для ключа вложенных данных без разбора данных в виде даты/времени.

data.forEach(function(d) { 
    d.key_date = d.test_date; 
    d.test_date = parseDate(d.test_date); 
}); 

var result = d3.nest() 
    .key(function(d) { 
     return d.key_date; 
    }) 
    .rollup(function(leaves) { 
     return leaves.length; 
    }) 
    .entries(data); 

Чтобы result я добавляю снова test_date как объект, так как key_date строка.

result.forEach(function(d) { 
    d.test_date = parseDate(d.key); 
}); 

У меня нет подсказки, если это хороший способ сделать это. Если нет, проконсультируйтесь пожалуйста. Спасибо ...

+0

Это не очень хорошая идея. Это просто задает вопрос, поскольку ваши ключи также являются строками. Это еще хуже, потому что вы дважды повторяете «результат» для анализа даты. Я предлагаю вам сначала сбрасывать первый «.forEach», использовать строки 'test_date' так же, как и для вашего гнезда, и проводить синтаксический анализ впоследствии. – altocumulus

+0

Я знаю, что повторение дважды по «результату» не является хорошей идеей. Но мне нужны «данные», как для дальнейшей обработки. Я возьму ваш совет и подумаю о лучшем решении. Спасибо вам. –

+0

Я нашел лучшее решение.Я делаю rollup в своем sql-заявлении. Кажется, все-таки быстрее. –

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