[英]Uncaught TypeError: undefined is not a function when using highcharts
[英]uncaught TypeError: undefined is not a function when using JSON object with name
我在Mongodb和AnguarlJS中使用D3js来显示我的数据。 一切都很好,直到我给我的JSON数组命名时,它才起作用。 然后角度开始抱怨东西,我不确定为什么。
这是与此原始代码一起使用的原始json数组
[
{
"defaultCategory":"Happy",
"timesUsed":2704659
},
{
"defaultCategory":"Sad",
"timesUsed":4499890
},
{
"defaultCategory":"Laughter",
"timesUsed":2159981
},
{
"defaultCategory":"Smirk",
"timesUsed":3853788
},
{
"defaultCategory":"Flirty",
"timesUsed":14106543
}
]
d3.json("data.json", function(error, data) {
data.forEach(function(d) {
d.timesUsed =+ d.timesUsed;
});
但是当我将json更改为这种格式时,它会中断
{
"mymood":[
{
"defaultCategory":"Happy",
"timesUsed":2704659
},
{
"defaultCategory":"Sad",
"timesUsed":4499890
},
{
"defaultCategory":"Laughter",
"timesUsed":2159981
},
{
"defaultCategory":"Smirk",
"timesUsed":3853788
},
{
"defaultCategory":"Flirty",
"timesUsed":14106543
}
]
}
d3.json("data.json", function(error, data) {
data.mymood.forEach(function(d) {
d.timesUsed =+ d.timesUsed;
});
在chrome控制台中,错误发生在data.mymood.foreach行,但是我不明白为什么,因为它正好返回相同的json,就像没有这样的名字一样
[对象,对象,对象,对象,对象]
函数中的参数d也返回数组中的相同对象
编辑
错误:
未捕获的TypeError:undefined不是函数
console.log(data)->对象{mymood:Array [5]}
console.log(data.mymood)-> [对象,对象,对象,对象,对象]
对于那些对完整代码感兴趣的人
就像Oscar指出的那样,forEach循环工作正常。 但是,仔细查看要点后,如果尝试使用mymood键,请确保还更改了使用的55行
var g = svg.selectAll('g')
.data(pie(data))
至
var g = svg.selectAll('g')
.data(pie(data.mymood))
同样在第76行
var total = d3.sum(data.map(function(d) {
至
var total = d3.sum(data.mymood.map(function(d) {
我抓住了您的项目存储库,并在本地环境中进行了尝试,并且可以呈现饼图和弹出窗口而不会看到任何错误。
您的代码似乎运行良好(根据我的测试) 。 我建议尝试调试代码,或者如果您觉得更舒适,请尝试执行尽可能多的console.log(...)
,并从头开始检查浏览器控制台 (我无话可说) 。 尝试同时使用Chrome中的开发者工具 ,这是一个更好的选择。
我试图通过使用d3.js
库复制您的上下文,并将包含您数据的json
文件上传到我的Dropbox中 ,以便能够执行ajax请求,并且一切都很好(新的JSON
结构也有效) 。 这是我所做的,可能可以帮助您学习新知识(见下文) 。
解决问题的可能提示/建议:
根据问题标题,似乎
data.mymood
是undefined
因此您无法对不存在的内容进行forEach
。 尝试验证事物,避免使用空指针(请参见示例) 。
JSON
结构是有效的,所以这不是问题。根据我的测试,语法似乎是有效的。
检查库之间是否存在冲突,尝试对一起使用所有需要的库进行一些研究(不确定这是否是您的情况,但可能会发生) 。
如第一段所述,检查您的浏览器控制台并进行一些调试 。
检查您的请求是否没有超时或正在发生其他事情,请检查“ 网络”标签,或使用Chrome的 开发者工具在浏览器控制台中记录您的请求(只是说) 。
现场演示: http : //jsfiddle.net/29f6n8L7/
d3.json('https://dl.dropboxusercontent.com/u/15208254/stackoverflow/data.json', function(data) {
// Some ways to avoid null pointers
var obj = (data || {}), // If 'data' is null, initialize as an Object
moods = (obj.mymood || []), // If 'obj.mymood' is null, initialize as an Array
time = 0,
mood;
// Same way to get 'mymood' from the object
console.log('Your obj.mymood contains: %o', obj.mymood);
console.log('Your obj["mymood"] contains: %o', obj['mymood']);
/**
* I will suggest to use a traditional loop instead of 'forEach'.
* Please read: http://stackoverflow.com/a/9329476/1178686
* for a better explanation
*/
for (var i = 0; i < moods.length; ++i) {
mood = moods[i];
if (mood) {
time += mood.timesUsed;
}
}
// Output
console.log('Sum of timesUsed is: %s', time);
});
数组在es5中每个都有一个内置对象,而对象则没有。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.