在我的2D阵列中引用某个位置时,处理一个类的项目并不断收到此错误。该项目是一个使用pearson相关性的视频游戏推荐系统。为了获得相关性,我们从数据库填充的用户名,他们排名的视频游戏以及他们给出的等级(评级)中提取结果。然后,这将用于在generateArrays函数中创建userArray(具有评级的所有用户的数组)和rankArray(下图所示的2D数组,包括所有游戏和用户给出的评级)。
错误来自我的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,等等)。之后是相似的项目阵列,它只找到两个用户都评价过的游戏。
我称之为sim_pearson的行基本上是这样的:
generateArrays(result);
//comparing the first two users
console.log("Pearson value: "+sim_pearson(rankArray, 0, 1);
真的不确定为什么会出现这个错误以及为什么我不能将var设置为等于我使用的rankArray的位置:
temp1 = rankArray[sItem][person1];
任何帮助都会很棒!
答案 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]
。