Работа над проектом для класса и продолжайте получать эту ошибку, когда я хочу ссылаться на местоположение в своем 2D-массиве. Проект представляет собой видеоигру рекомендательной системы, использующей корреляции pearson. Чтобы получить корреляции, мы извлекаем результаты из базы данных, заполняющей имена пользователей, видеоигру, которую они оценили, и рейтинг (рейтинг), который они дали. Затем он используется для создания userArray (массив всех пользователей, у которых есть рейтинги), и rankArray (2D-массив, изображенный ниже со всеми играми и пользователями рейтингов, предоставленными им) в функции generateArrays.JS 2D Array Error: "TypeError: Невозможно прочитать свойство '0' undefined"
ошибка исходит из линии в моей функции 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);
Действительно уверен, почему эта ошибка встречающаяся и почему я не могу установить вар равным место с rankArray Я сделал так:
temp1 = rankArray[sItem][person1];
Любая помощь была бы фантастической!
Какая строка является ошибкой? – Barmar