2016-12-05 85 views
0

我尝试编写脚本来遍历对象,并返回那些类型等于HTML中设置的自定义数据类型的脚本。然而,即时通讯无法将变量与对象数组传递给我的for循环。你能告诉我在这段代码中我做错了什么吗?我收到:无法将带有JSON对象的变量传递给循环

无法读取未定义

PS的特性 '长度'。它在原始的JavaScript来完成,没有jQuery的

var btn = document.getElementById("btn"); 
var przepisy; 

function findData(data) { 
    var kuchnia = data.dataset.type; 
    var myRequest = new XMLHttpRequest(); 

    myRequest.onreadystatechange = function() { 
     if (this.readyState === 4 && this.status == 200) { 

      przepisy = JSON.parse(myRequest.responseText); 
     } 
    }; 

    myRequest.open('GET', 'js/przepisy.json'); 
    myRequest.send(); 


    for (i = 0; i < przepisy.length; i++) { 
     var results = ""; 
     var obj = przepisy[i]; 
     var type = przepisy.type; 

     if (type === kuchnia) { 

      results += obj.name; 

      document.write(results); 
     } 
    } 
} 
+0

似乎像'przepisy'没有正确初始化。你能证实吗? – 31piy

+0

您正试图在完成之前访问异步操作的结果。 – Pointy

+0

首先,将您的循环包含在成功回调函数中,以便有一个对象可以查看。第二:'przepisy = JSON.parse(myRequest.responseText);'应该返回一个Object,而不是一个数组。要找出对象中有多少个属性,使用'Object.keys(przepisy).length'。或者,如果你真的想要获得一个数组。您需要查看存储您所寻找的数组的其中一个属性的对象。 –

回答

3

的问题是,你正在调用你的循环,你取回数据之前,这就是为什么长度为0。您应该只是继续前进for循环进入你的回应:

function findData(data) { 
     var kuchnia = data.dataset.type; 
     var myRequest = new XMLHttpRequest(); 

      myRequest.onreadystatechange = function() { 
      if (this.readyState === 4 && this.status == 200) { 

         przepisy = JSON.parse(myRequest.responseText); 

         for(i = 0; i < Object.keys(przepisy).length; i++) { 
          var results = ""; 
          var obj = przepisy[i]; 
          var type = przepisy.type; 

          if(type === kuchnia) { 

           results += obj.name; 

           document.write(results); 
         } 
        } 
      } 
     }; 

     myRequest.open('GET','js/przepisy.json'); 
     myRequest.send(); 



    } 
+0

而且,不要在对象上使用'.length'。使用:'Object.keys(przepisy).length' –

+0

谢谢你非常迅速的回答,错误消失了,但现在document.write不会在我运行该函数时触发。根本没有结果。这可能是什么原因? – Ganga

+0

@ScottMarcus感谢您的建议。我更新了答案。 – BlackHatSamurai