2014-01-09 6 views
2

Я пытаюсь использовать вложенный массив json для построения диаграммы нескольких серий с помощью d3.js. Я просмотрел много мест на этом сайте и других, и, хотя есть похожие темы, я не могу заставить синтаксис работать с моей конкретной проблемой (что является простым).Вложенный массив JSON и D3JS

Чтобы сделать линейный график (как один здесь: http://bl.ocks.org/mbostock/3883245), я могу разобрать этот JSON файл:

[{"date":"1-May-12","close":58.13},{"date":"30-Apr-12","close":53.98},{"date":"27-Apr-12","close":67}] 

Используя этот яваскрипта синтаксис:

d3.json("data/data2.json", function(error, data) {    
data.forEach(function(d) {        
    d.date = parseDate(d.date);       
    d.close = +d.close;         
}); 

Но что, если JSON является вложенным массивом? Например:

{ 
"Stock01":[{"date":"1-May-12","close":58.13},{"date":"30-Apr-12","close":53.98},{"date":"27-Apr-12","close":67}] 
"Stock02":[{"date":"1-May-12","close":28.13},{"date":"30-Apr-12","close":33.98},{"date":"27-Apr-12","close":47}] 
} 

Я пробовал варианты, как ниже сценарий, но я не имею никакой удачи:

d3.json("data/data2.json", function(error, data) {    
data.forEach(function(d) {        
    d.date = parseDate(d[0].date);       
    d.close = +d[0].close;         
}); 

Если у кого есть советы о том, как перемещаться вложенную массив JSON с data.forEach, я был бы благодарен. Заранее благодарю за любую помощь.

+1

Для дальнейшего уточнения: в [ '.forEach()' функцию] (https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/Array/forEach) работает только с массивами, вызывая внутреннюю функцию один раз для каждого элемента массива. Вам нужно получить доступ к отдельным массивам в вашем объекте данных, а затем использовать '.forEach()' для сканирования через них. – AmeliaBR

ответ

2

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

Вы хотите что-то вроде этого:

d3.json("data/data2.json", function(error, data) { 
    for (k in data) { 
     var k_data = data[k]; 
     k_data.forEach(function(d) {        
      d.date = parseDate(d[0].date);       
      d.close = +d[0].close;        
     }); 
    } 
}); 

Кроме того, он выглядит как forEach принимает функцию, которая имеет два аргумента, key и value:

forEach: function(f) { 
    for (var key in this) { 
    if (key.charCodeAt(0) === d3_map_prefixCode) { 
     f.call(this, key.substring(1), this[key]); 
    } 
    } 
} 

Например:

values: function() { 
    var values = []; 
    this.forEach(function(key, value) { 
    values.push(value); 
    }); 
    return values; 
} 

Позже: AmeliaBR верна о forEach: он недоступен для использования на объектах/словарях.

var a = {"stock1": [1, 2, 3, 4], "stock2": [2, 3, 5, 7], "stock3": [1,2, 4,8]}; 
a.forEach(function(value, key){ console.log(value, key);}); 
/* TypeError: Object #<Object> has no method 'forEach' */ 

Но это работает:

a["stock1"].forEach(function(value, key){ console.log(value, key);}); 
1 0 
2 1 
3 2 
4 3 
+1

Первая версия - правильная идея, но вы скопировали ошибки из путаной попытки @ ekatz. Вот исправленная функция: http://fiddle.jshell.net/4QCsX/. Другим вариантом было бы использовать метод [entries3) [d3 'entries (object)'] (https://github.com/mbostock/d3/wiki/Arrays#wiki-d3_entries) для преобразования объекта данных в массив, который должен будет в любом случае, чтобы присвоить разные запасы различным строкам на графике, например: http://fiddle.jshell.net/4QCsX/1/ – AmeliaBR

+0

Это действительно полезно, и я получаю данные для правильного анализа внутри каждого массива. Однако, когда я пытаюсь запустить диаграмму, теперь я получаю сообщение об ошибке: Ошибка: анализ проблем d = «MNaN, NaNLNaN, NaN». Любая идея, почему это может быть? – ekatz

+0

Спасибо за помощь. Jsfiddle из этой диспозиции также помогает: http://stackoverflow.com/questions/20016549/d3-multi-series-line-chart-from-pivoted-json – ekatz

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