2013-08-30 72 views
2

我对d3和javascript一般都还是个新手,所以我所见过的大多数做法都与简单的数组有关,但从不是对象。现在,我试图通过使用json文件中的数据来创建一个构成一周数据的简单图表。首先,数据结构颇像与任意值如下:过滤d3.js的JSON数据

{"2013-08-21":{"orders":"10","revenue":"1000"}, 
{"2013-08-22":{"orders":"20","revenue":"1800"}, 
{"2013-08-23":{"orders":"15","revenue":"1200"}, 
...} 

,我要面对现在试图找出如何有效地传递日期,使用XScale域,以及问题订单或收入放入yScale域。如果它是一个CSV或TSV文件,我可以只使用这样的:

xScale.domain(d3.extent(data, function(d) {return d.date;})); 
yScale.domain(d3.extent(data, function(d) {return d.orders;})); 

但是,当我试图做同样的事情JSON对象,它告诉我下面的:

Uncaught TypeError: #<Object> is not a function 

能有人请帮助阐明这个问题?我可以尝试为日期,订单和收入创建列表数组,但是还有其他方法吗?

谢谢你的时间!

编辑

当我尝试导入JSON文件后,将数据映射会发生类型错误:

d3.json("report.json", function(error, json) { 
    if (error) return console.warn(error); 
    dataset = json; 
    dataset = dataset.map(function(d){ 
     var date = d3.keys(d)[0]; 
     d[date].date = date; 
     return d[date]; 
    }); 
}); 

具体而言,在这一行:

dataset = dataset.map(function(d){ ... }) 

Uncaught TypeError: Object #<Object> has no method 'map' 
+0

抛出'TypeError'的实际代码是什么? – nrabinowitz

+0

嗨nrabinowitz,请参阅上面编辑部分。谢谢! – peianwu

+0

对不起,我想我可能已经想出了如何将数据重新组织为我需要的格式。感谢您的建议! – peianwu

回答

4

你基本上有两种选择: 1.把你的数据转换为更容易处理的格式 2.尝试处理您当前的格式。

我认为(1)将让您的生活更轻松在大多数情况下:

data = data.map(function(d) { 
    // get the date 
    var date = d3.keys(d)[0]; 
    // put it into the inner object 
    d[date].date = date; 
    // return the inner object 
    return d[date]; 
}); 

这给你喜欢

{ 
    "orders": "10", 
    "revenue": "1000", 
    "date": "2013-08-21" 
} 

它们更容易对付行。当你这样做的时候分析日期也是一个好主意。

+0

嗨nrabinowitz,谢谢你的快速反应!我会试着进一步研究你的解决方案,因为我仍然有相同的“Uncaught TypeError”问题,这会阻止我复制你的答案。 – peianwu

+0

来格式化你的JSON有很多网站可以自由而轻松地做到这一点 – tomtomtom

+0

谢谢汤姆!对不起,我真的对所有这些都是新的,所以我不知道这是存在的。我一定会研究它。 – peianwu