【问题标题】:Accessing a value via key in json is throwing undefined通过 json 中的键访问值会抛出 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); 看看它打印了什么

标签: javascript json node.js typescript


【解决方案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(或任何其他浏览器)的开发工具并添加一个调试器来查看代码流、如何为变量赋值、它们在哪里更新等等...

    【讨论】:

      猜你喜欢
      • 2017-11-03
      • 2016-03-11
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 2020-12-14
      相关资源
      最近更新 更多