2015-08-08 31 views
0

我想创建一系列的数组中有10个值,我可以用它们来计算。阵列变得undefined后console.log他们

我的代码是像这样的(JS):

$.ajax({ 
    dataType: "json", 
    type: 'GET', 
    url: 'page.php', 
    success: function(data){ 
     // declare all arrays holding valuable statistics 
     var csArray = []; 
     var assistArray = []; 
     var killArray = []; 
     var gameTimeArray = []; 
     var championArray = []; 
     var deathArray = []; 
     var jungleCSArray = []; 
     var counterJungleCSArray = []; 
     var roleArray = []; 
     var laneArray = []; 
     var crowdControlArray = []; 


     for (i=0; i<10; i++){ 
      var value = data.matches[i].participants[0].stats.minionsKilled; 
      csArray[i] = value; 
     } 

     for (i=0; i<10; i++){ 
      var value = data.matches[i].participants[0].stats.assists; 
      assistArray[i] = value; 
     } 

     for (i=0; i<10; i++){ 
      var value = data.matches[i].participants[0].stats.kills; 
      killArray[i] = value; 
     } 

     for (i=0; i<10; i++){ 
      var value = data.matches[i].matchDuration; 
      gameTimeArray[i] = value; 
     } 

     for (i=0; i<10; i++){ 
      var value = data.matches[i].participants[0].championId; 
      championArray[i] = value; 
     } 

     for (i=0; i<10; i++){ 
      var value = data.matches[i].participants[0].stats.deaths; 
      deathArray[i] = value; 
     } 

     for (i=0; i<10; i++){ 
      var value = data.matches[i].participants[0].stats.neutralMinionsKilledTeamJungle; 
      jungleCSArray[i] = value; 
     } 

     for (i=0; i<10; i++){ 
      var value = data.matches[i].participants[0].stats.neutralMinionsKilledEnemyJungle; 
      counterJungleCSArray[i] = value; 
     } 

     for (i=0; i<10; i++){ 
      var value = data.matches[i].participants[0].timeline.role; 
      roleArray[i] = value; 
     } 

     for (i=0; i<10; i++){ 
      var value = data.matches[i].participants[0].timeline.lane; 
      laneArray[i] = value; 
     } 

     for (i=0; i<10; i++){ 
      var value = data.matches[i].participants[0].stats.totalTimeCrowdControlDealt; 
      crowdControlArray[i] = value; 
     } 
     console.log(csArray); 
     console.log(assistArray); 
     console.log(killArray); 
     console.log(gameTimeArray); 
     console.log(championArray); 
     console.log(deathArray); 
     console.log(jungleCSArray); 
     console.log(counterJungleCSArray); 
     console.log(roleArray); 
     console.log(laneArray); 
     console.log(crowdControlArray); 

当我去我的浏览器,它console.logs正确:

enter image description here

但是当我尝试键入类似:

console.log(killArray[1]); 

我收到以下消息:

ReferenceError: killArray is not defined. 

最终,我试图在下游计算中使用这些数字,并且得到“NaN”回报。经过故障排除并确定我的数组似乎不再存在,我想它可能试图将空值添加到其他空值并返回NaN。

我的计算方法如下:

  //ALGORITHM START 
     for (i=0, i<10; i++;){ 
      switch(roleArray[i]) { 
       case "DUO": 
        //assumes top lane duo 
        var role = "L"; 
        console.log(role); 
        break; 
       case "DUO_CARRY": 
        //assumes bot lane adc 
        var role = "A"; 
        console.log(role); 
        break; 
       case "DUO_SUPPORT": 
        //assumes bot lane support 
        var role = "S"; 
        console.log(role); 
        break; 
       case "SOLO": 
        //assumes mid or top solo 
        var role = "L"; 
        console.log(role); 
        break; 
       case "NONE": 
        //assumes jungle, check lane 
        var role = "J"; 
        console.log(role); 
        break; 
      } 
     } 

     switch(role){ 
      case "L": 
       var aFactor = 1.00; //kills 
       var bFactor = 0.66; //assists 
       var cFactor = 0.75; //deaths 
       var dFactor = 0.80; //cs 
       var eFactor = 0.20; //jungle cs 
       var fFactor = 0.55; //counter jungle cs 
       var gFactor = 0.50; //cc time 
       break; 
      case "A": 
       var aFactor = 1.00; 
       var bFactor = 0.10; 
       var cFactor = 1.00; 
       var dFactor = 1.00; 
       var eFactor = 0.20; 
       var fFactor = 0.30; 
       var gFactor = 0.33; 
       break; 
      case "S": 
       var aFactor = 0.20; 
       var bFactor = 2.00; 
       var cFactor = 0.33; 
       var dFactor = 0.10; 
       var eFactor = 0.33; 
       var fFactor = 0.55; 
       var gFactor = 2.00; 
       break; 
      case "J": 
       var aFactor = 1.00; 
       var bFactor = 1.50; 
       var cFactor = 0.75; 
       var dFactor = 0.33; 
       var eFactor = 1.20; 
       var fFactor = 1.60; 
       var gFactor = 1.00; 
       break; 
      } 

      //FORMULA 
      for (i=0; i>10; i++){ 
      var pvpFactor = ((aFactor * killArray[i]) + (bFactor * assistArray[i]))/(cFactor * deathArray[i]); 
      var pveFactor = ((dFactor * csArray[i]) + (eFactor * jungleCSArray[i]) + (fFactor * counterJungleCSArray[i]))/(gameTimeArray[i]); 
      var auxFactor = (gFactor * crowdControlArray[i]); 

      var rawHMC = (0.8 * pvpFactor) + (0.4 * pveFactor) + (2.5 * auxFactor) 

      var HMCarray = []; 

       console.log (rawHMC); 
       HMCarray[i] = rawHMC; 

      } 


     } 

    }); 

});

The console.log (rawHMC);返回NaN值。

基本上我的问题是:为什么我不能console.log我的数组,为什么我得到一个NaN返回?这是我的数组循环或我的switch语句?

谢谢!

+0

为它创建一个小提琴 – dom

回答

1

您的数组只在成功处理程序中知道。您需要将它们移出该范围以外的范围才能看到它们。 如果你在成功后尝试使用console.log这些变量,它们就会消失。

这里是如何让一个var保存所有数组,并有一个循环将它们全部更新。

// declare all arrays holding valuable statistics 
var statsArr = { 
    csArray  :[], 
    assistArray :[], 
    killArray :[] 
}; // no comma on the last 
$.ajax({ 
    dataType: "json", 
    type: 'GET', 
    url: 'page.php', 
    success: function(data){ 

    for (var i=0; i<10; i++){ 
     var stats = data.matches[i].participants[0].stats; 
     statsArr.csArray.push(stats.minionsKilled); 
     statsArr.assistArray.push(stats.assists); 
    } 

数组现在在全局范围内保存在statsArr对象中。

要在以后使用:

var pvpFactor = ((aFactor * statsArr.killArray[i]) 
+0

数组仍然在成功处理程序内,他们不是? – Vranvs

+0

我想你看不到整个代码,因为我把它分成两部分,但我的程序显示,对应于成功代码块的大括号包含在内,基本上包含了我的所有代码 – Vranvs

+0

它们现在处于全局范围内。查看更新 – mplungjan

0

你需要明白两两件事:变量的作用域和异步回调。你也许可以在网上找到许多关于这些,所以我就放弃简要的定义:

  • 变量的作用域是其中变量是可见的;使程序更容易理解,语言让你保持相互隔离的部件,在JS,每一个变量时,才能看到你写var里面的功能,加上块内定义的函数
  • 异步回调改变定义一个变量;你不知道AJAX请求需要多长时间,所以你让JS在等待的时候运行其他代码,当它得到响应时,你的回调会触发。

因此,您需要做的第一件事是通过正确地放置您的var语句来在所有代码可以看到它们的范围内定义变量。然后,您需要确保从它们读取的代码在写入它们的代码之前不会运行,通过考虑回调何时运行。

+0

非常感谢,这清理了很多东西! – Vranvs

相关问题