通过 json 中的键访问值会抛出 undefined

Posted

技术标签:

【中文标题】通过 json 中的键访问值会抛出 undefined【英文标题】:Accessing a value via key in json is throwing undefined 【发布时间】:2018-11-23 14:03:53 【问题描述】:

您好,我遇到了一个奇怪的错误,我有一个下面的对象

    let dataFromUrl =  
      "careerTrackId": 510,
       "country": [],
       "geography": [18],
       "ou2": [51549564],
       "ou3": [],
       "ou4": [],
       "ou5": [],
       "ou6": [],
       "ou7": [],
       "ou8": [],
       "region": []
     

console.log(dataFromUrl.geography.length);


// Here in this method iam using this dataFromUrl

   

     function getGeoUnitId(dataFromUrl) 
    console.log("dataFromUrl",dataFromUrl);
  console.log("dataFromUrl.geography",dataFromUrl.geography);
  console.log("dataFromUrl.ou2",dataFromUrl.ou2);
  console.log("dataFromUrl.careerTrackId",dataFromUrl.careerTrackId);
      let geoUnitId = "(" + dataFromUrl.geography + ")";
      let str2 = "geounitid IN " + geoUnitId;
      if (dataFromUrl.geography.length == 0) 
        str2 = "";
      
      return str2;
    

但是当我尝试在我的nodejs 代码中使用dataFromUrl.geography.length 时,我得到以下错误:

['TypeError: 无法读取未定义的属性'长度']

当我的目标是 es5 bu 时,此代码正在运行,一旦我将目标更改为 es6,它就开始中断。有谁知道为什么会突然发生这种情况。

【问题讨论】:

是否有更多代码可以展示您如何访问它?看来它应该对我有用。 我在 typescript-playground 中做同样的事情,它为我工作。 我刚试过你的代码,它工作正常。你确定你的原始代码没有遗漏什么吗? 不! iam 只是将 iam 使用该属性的方法放在其中。 尝试按顺序记录,你可能会覆盖变量,从const dataFromUrl = ....开始,而不是let。然后执行:console.log('dataFromUrl: ', dataFromUrl);console.log('dataFromUrl.geography: ', dataFromUrl.geography.length);console.log('dataFromUrl.geography.length: ', dataFromUrl.geography.length); 看看它打印了什么 【参考方案1】:

最后,我能够修复它,我仍然不知道为什么,但这有效: JSON.parse() 成功了。

let dataFromUrl =  
      "careerTrackId": 510,
       "country": [],
       "geography": [18],
       "ou2": [51549564],
       "ou3": [],
       "ou4": [],
       "ou5": [],
       "ou6": [],
       "ou7": [],
       "ou8": [],
       "region": []
     


  function getGeoUnitId(dataFromUrl) 
    console.log("dataFromUrl",dataFromUrl);
  console.log("dataFromUrl.geography",dataFromUrl.geography);
  console.log("dataFromUrl.ou2",dataFromUrl.ou2);
  console.log("dataFromUrl.careerTrackId",dataFromUrl.careerTrackId);
      let geoUnitId = "(" + dataFromUrl.geography + ")";
      let str2 = "geounitid IN " + geoUnitId;
      if (dataFromUrl.geography.length == 0) 
        str2 = "";
      
      return str2;
    

 dataFromUrl = JSON.parse(dataFromUrl );
 console.log(dataFromUrl.geography.length); // this started giving me 1

【讨论】:

【参考方案2】:

通过 cmets 后,我可能的猜测是您调用了不带参数的 getGeoUnitId(),它使用了您可能已更改的外部定义的 getGeoUnitId

尝试重命名参数变量名

function getGeoUnitId(somethingOtherThan_dataFromUrl) 

提示:如果您在理解 JS 代码时遇到问题,您应该使用 Chrome(或任何其他浏览器)的开发工具并添加一个调试器来查看代码流、如何为变量赋值、它们在哪里更新等等...

【讨论】:

以上是关于通过 json 中的键访问值会抛出 undefined的主要内容,如果未能解决你的问题,请参考以下文章

通过浏览器访问 IP 地址时,在 nginx 上创建新的 Lumen 应用程序会抛出 404

JSON语法

为啥 JSON.parse 会抛出跨域错误?

为啥我在 AngularJS 中的日期输入字段会抛出类型错误?

json字符串转对象,遇到空字符串会抛异常吗

JSON