2

Работа над проектом для класса и продолжайте получать эту ошибку, когда я хочу ссылаться на местоположение в своем 2D-массиве. Проект представляет собой видеоигру рекомендательной системы, использующей корреляции pearson. Чтобы получить корреляции, мы извлекаем результаты из базы данных, заполняющей имена пользователей, видеоигру, которую они оценили, и рейтинг (рейтинг), который они дали. Затем он используется для создания userArray (массив всех пользователей, у которых есть рейтинги), и rankArray (2D-массив, изображенный ниже со всеми играми и пользователями рейтингов, предоставленными им) в функции generateArrays.JS 2D Array Error: "TypeError: Невозможно прочитать свойство '0' undefined"

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); 

Действительно уверен, почему эта ошибка встречающаяся и почему я не могу установить вар равным место с rankArray Я сделал так:

temp1 = rankArray[sItem][person1]; 

Любая помощь была бы фантастической!

+0

Какая строка является ошибкой? – Barmar

ответ

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], который не является действительным.

+0

Удивительный! Это фиксировало все ошибки, которые я получал. Спасибо, Бармар! –

+0

Вы должны принять решение, если оно решит проблему. Нажмите галочку рядом с ней. – Barmar

Смежные вопросы