JS 2D数组错误:“TypeError:无法读取未定义的属性'0'”

时间:2016-12-20 19:52:04

标签: javascript arrays multidimensional-array undefined typeerror

在我的2D阵列中引用某个位置时,处理一个类的项目并不断收到此错误。该项目是一个使用pearson相关性的视频游戏推荐系统。为了获得相关性,我们从数据库填充的用户名,他们排名的视频游戏以及他们给出的等级(评级)中提取结果。然后,这将用于在generateArrays函数中创建userArray(具有评级的所有用户的数组)和rankArray(下图所示的2D数组,包括所有游戏和用户给出的评级)。

enter image description here

错误来自我的sim_pearson函数中的行,该函数计算实际的相关值。当我尝试引用特定用户对特定游戏给出的评级时,会出现错误。我不确定为什么因为我之前以类似的方式引用了2D数组并且没有问题。

这是我发生错误的sim_pearson函数。

function sim_pearson(rankArray, person1, person2){
  var similaritems = [];
  for(var i = 0; i <= 9; i++){
    if (rankArray[i][person1] !== 0){
      if(rankArray[i][person2] !== 0){
        similaritems.push(i);
      }
    }
  }
  if (similaritems.length === 0){
    return 0;
  }
  console.log(similaritems);
  var n = similaritems.length;
  var temp1, temp2, sum1, sum2, sum1Sq, sum2Sq, pSum = 0;
  for (var x = 0; x <= n; x++){
    var sItem = similaritems[x];
    temp1 = rankArray[sItem][person1];
    temp2 = rankArray[sItem][person2];
    sum1 = sum1 + temp1;
    sum2 = sum2 + temp2;
    sum1Sq = sum1Sq + Math.pow(temp1, 2);
    sum2Sq = sum2Sq + Math.pow(temp2, 2);
    //sum of products
    pSum = pSum + (temp1 * temp2);
  }
  var num = pSum - (sum1*sum2/n);
  var den = Math.sqrt((sum1Sq-Math.pow(sum1, 2)/n)*(sum2Sq-Math.pow(sum2, 2)/n));
  if (den === 0){
    return 0;
  }
  var r = num/den;
  return r;
}

这是我创建数组的地方:

var userArray = [];
var rankArray = [];
function generateArray(result){
  //generate user array
  var i,item;
  var temp = 0;
  for (i in result.rows) {
    item = result.rows[i];
    var userExists = false;
    for (var x = 0; x<=userArray.length; x++){
      if(item.username == userArray[x]){
        userExists = true;
      }
    }
    if(userExists === false){
      userArray.push(item.username);
    }
  }
  for(var y =0; y<10; y++){
    rankArray[y] = [];
    for(var z = 0; z<userArray.length; z++){
      rankArray[y][z] = 0;
    }
  }
  //creating rankarray
  var w, item1;
  for(w in result.rows) {
    item1 = result.rows[w];
    for(var k in userArray) {
      if (item1.username == userArray[k]) {
        temp = k;
      }
    }
    rankArray[(item1.vgnum - 1)][temp] = item1.rank;
  }
}

这是我们的阵列创建时的图片。 userArray首先持有所有用户,然后rankArray在每个游戏的每个索引中设置一个数组(只有10个),并且在该数组中是所有用户的排名(0是用户1,1是用户2,等等)。之后是相似的项目阵列,它只找到两个用户都评价过的游戏。

enter image description here

我称之为sim_pearson的行基本上是这样的:

generateArrays(result);
//comparing the first two users
console.log("Pearson value: "+sim_pearson(rankArray, 0, 1);

真的不确定为什么会出现这个错误以及为什么我不能将var设置为等于我使用的rankArray的位置:

temp1 = rankArray[sItem][person1];

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:1)

这一行可能是问题所在:

for (var x = 0; x <= n; x++){

应该是x < n。自n = similaritems.length起,similaritems的索引从0运行到n-1。所以在最后一次迭代中,当你这样做时:

var sItem = similaritems[x];

设置sItem = undefined。然后你做:

temp1 = rankArray[sItem][person1];

rankArray[undefined]undefined,因此会尝试访问无效的undefined[person1]