【问题标题】:Cannot read property 'length' of undefined javascript arary无法读取未定义的 JavaScript 数组的属性“长度”
【发布时间】:2020-05-21 08:52:28
【问题描述】:

我得到一个这样的 JSON。我想获取 elem tActivitats 并复制到一个数组中:

[
  {
    "identificador": "A462D996C3DDF4C94A3BF1A23EBF2906",
    "num_grup": 1,
    "activitats": "1",
    "tActivitats": [
      {
        "mostrIdioma": "S",
        "calendariWeb": "S",
        "nomActiv": "Visita Museu",
        "codiActiv": "1",
        "tipus": "S",
        "idioma": "0"
      }
    ]
  }
]

对于json的每个元素:

var tActivitatsArray = new Array();
$.post('../ServletJson', {
  elem: 'accesWeb',
  sessionId: "<%=sessionActual%>"
}, function(data) {
  $.each(data, function(t, elem) {
    //dostuff
    tActivitatsArray = elem.tActivitats;
    //dostuff
  });
});

然后我有一个函数,我在其中传递 elem tActviitatsArray 并尝试迭代并得到错误无法读取未定义的属性“长度”

for (var i = 0; i < tActivitatsArray.length; i++) {
  console.log("test" + tActivitatsArray[i].nomActiv);
}
console.log(JSON.stringify(data));

这就是 console.log(JSON.stringify(data));结果:


[
   {
      "identificador":"1AE2886120F41BBC0F76567993EF76E0",
      "num_grup":1,
      "activitats":"1",
      "horari":"sessio_1_13_1200_0_1345",
      "total":8.5,
      "num_pers":"3",
      "tarifa":"tarifa_1_3_1",
      "preu":"8.5#1~0#1",
      "butaques":null,
      "nomSala":"",
      "numerada":"false",
      "promo":"",
      "referencia":"100249790",
      "dataVisita":"22/05/2020",
      "combinada":"",
      "article":null,
      "precioTemp":[
         {
            "codActiv":"1",
            "codTarifa":"1",
            "precio":"8.50",
            "dtePromo":"0",
            "dteEuro":"%",
            "total":25.5,
            "tipus":"normal"
         }
      ],
      "tActivitats":[
         {
            "mostrIdioma":"S",
            "calendariWeb":"S",
            "nomActiv":"Visita Museu",
            "codiActiv":"1",
            "tipus":"S",
            "idioma":"0"
         }
      ],
      "tTarifa":[
         {
            "codTarifa":"1",
            "nomTarifa":"General"
         },
         {
            "codTarifa":"1",
            "nomTarifa":"General"
         }
      ]
   },
   {
      "identificador":"1AE2886120F41BBC0F76567993EF76E0",
      "num_grup":2,
      "activitats":"1",
      "horari":"sessio_1_1_1000_0_1059",
      "total":8.5,
      "num_pers":"3",
      "tarifa":"tarifa_1_3_1",
      "preu":"8.5#1~0#1",
      "butaques":null,
      "nomSala":"",
      "numerada":"false",
      "promo":"",
      "referencia":"100249790",
      "dataVisita":"23/05/2020",
      "combinada":"",
      "article":null,
      "precioTemp":[
         {
            "codActiv":"1",
            "codTarifa":"1",
            "precio":"8.50",
            "dtePromo":"0",
            "dteEuro":"%",
            "total":25.5,
            "tipus":"normal"
         }
      ],
      "tActivitats":[
         {
            "mostrIdioma":"S",
            "calendariWeb":"S",
            "nomActiv":"Visita Museu",
            "codiActiv":"1",
            "tipus":"S",
            "idioma":"0"
         }
      ],
      "tTarifa":[
         {
            "codTarifa":"1",
            "nomTarifa":"General"
         },
         {
            "codTarifa":"1",
            "nomTarifa":"General"
         }
      ]
   }
]

【问题讨论】:

  • 这是i 的任何特定值吗?
  • 循环的最后一个代码块必须在函数 $.post 内,因为需要在访问数据之前解析承诺
  • 大卫是对的。如果由于任何原因无法执行此操作,您可以使用 $.ajax({...async: false...}) 而不是 $.post() 快捷方式发出同步请求。

标签: javascript jquery arrays json jsp


【解决方案1】:

看起来后端是一个 ASP.NET 服务器。我可以通过&lt;%=sessionActual%&gt; 来判断。

在这种情况下,$.postsuccess 函数将接收一个 json 对象 data,其中包含一个子元素 d,其中包含来自服务器的请求资源。

改变这一行:

$.each(data,function(t,elem) {
...
}

进入:

$.each( data.d ,function(t,elem){ 
   ...
}

【讨论】:

    【解决方案2】:

    嗯...逻辑说,如果正在接收数据并将其正确转换为数组,它应该可以工作:

    var a = [
          {
            "mostrIdioma": "S",
            "calendariWeb": "S",
            "nomActiv": "Visita Museu",
            "codiActiv": "1",
            "tipus": "S",
            "idioma": "0"
          }
        ];
    
    for (var i = 0; i < a.length; i++) {
        console.log("test: " + a[i].nomActiv);
    }
    
    test: Visita Museu
    

    你能在回调中记录JSON.stringify(data) 的输出吗? 顺便说一句,您在 each 循环中覆盖了 tActivitatsArray。您应该推送/合并而不是覆盖该值。我想这是你的主意,对吧?

    【讨论】:

    • 是的,我想将对象转换为数组。是的,这就是我的想法。
    • @proera 那么你需要tActivitatsArray.push(elem.tActivitats)tActivitatsArray.concat(elem.tActivitats)
    • @proera 请使用字符串化输出更新您的帖子,以便我可以看到真正的返回值。或者只是使用“调试器;”在那里停止执行并查看单个元素的真实类型。
    • 我已经添加了字符串化输出
    • @proera 好吧,数据没问题,所以它一定是异步问题。请查看stackoverflow.com/questions/61930721/…
    【解决方案3】:

    三件事;

    1. 在迭代之前检查 tActivitatsArray 是否已定义。

    2. 值初始化后迭代。

    3. 确保tActivitats 数组不是undefined 响应。

    【讨论】:

    • 是的,已初始化。太奇怪了,因为它打印了第一个元素,然后说错误:test Visita Museu mainFunctions.js?v2.3:2633 Uncaught TypeError: Cannot read property 'length' of undefined at Object. (mainFunctions.js?v2 .3:2633)
    • 所以你得到了第一个元素,你能检查第二个元素是否未定义..吗?另外,你能添加这一行 if(Array.isArray(tActivitatsArray) { // your for iterate loop ... } 这将处理错误,还会告诉你有多少正在打印
    • 我只有一个元素。它打印第一个,然后返回未定义的长度错误
    • 希望你在做这样的事情。jsfiddle.net/bLh0y52r/2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-04
    • 1970-01-01
    • 2015-08-10
    相关资源
    最近更新 更多