繁体   English   中英

未捕获的TypeError:使用带名称的JSON对象时,undefined不是一个函数

[英]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)-> [对象,对象,对象,对象,对象]

对于那些对完整代码感兴趣的人

https://gist.github.com/gwong89/e3a29b64d94ad20256bb

就像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.mymoodundefined因此您无法对不存在的内容进行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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM