Первое значение возвращает «неопределенное» при разборе со следующим - PullRequest
1 голос
/ 24 января 2012

Когда я анализирую этот объект с помощью функции ниже, первое значение, которое я получаю в таблице, - это «неопределенное». Есть идеи, почему это может происходить? Я неправильно анализирую? Должен ли я использовать другой цикл?

var students = [
{
    fn : "Stone",
    ln : "Carpenter",
    scores : [61,99,73,68,80,62,176,78]
},
{
    fn : "Samson",
    ln : "Sears",
    scores : [68,193,91,190,95,65,171,75]
},
{
    fn : "Quin",
    ln : "Morton",
    scores : [79,95,161,92,182,163,198,182]
},
{
fn : "Qunitessa",
        ln : "Hardy",
    scores : [99,65,75,69,77,67,86,78]
},
{
    fn : "Ashley",
    ln : "England",
    scores : [147,70,81,64,148,71,70,63]
},
{
    fn : "Thaddeus",
    ln : "Hutchinson",
    scores : [99,190,188,185,160,88,89,76]
},
{
    fn : "Yeo",
    ln : "Hayes",
    scores : [88,64,199,165,198,76,74,81]
},
{
    fn : "Rylee",
    ln : "Larson",
    scores : [71,126,63,71,168,173,175,88]
}
];

function updateTable(obj) {
var rows, 
len;

len = obj.length;

rows = "<table>"
rows += "<tbody>"


for (var i in obj) {

var scoreLen,
score,
sum;

scoreLen = obj[i].scores.length;
scores = obj[i].scores;

rows += "<tr>"
rows += "<td>" + obj[i].fn + "</td>"
rows += "<td>" + obj[i].ln + "</td>"

    for(j=0; j<scoreLen; j+=1) {
        rows += "<td>" + scores[j] + "</td>"
    }

rows += "<td>" + arraySum(obj[i].scores) + "</td>"
rows += "</tr>"

}

document.getElementsByTagName('body')[0].innerHTML = rows
console.log(rows)
}

Ответы [ 3 ]

2 голосов
/ 24 января 2012

Ниже приведена правильная реализация функции updateTable.students - это массив объектов, но вы пытаетесь получить к нему доступ как к объекту объектов.Вот почему он не определен.

var students = [{obj1:stuff}, {obj2:stuff}, ... ,{objn:stuff}]

students[0] returns {obj1:stuff}, students[1] returns {obj2:stuff} и т. Д.

function updateTable(arr) {
var rows, 
len;

len = arr.length;

rows = "<table>"
rows += "<tbody>"


for (var i =0; i< len; i++) {

var scoreLen,
score,
sum;

scoreLen = arr[i].scores.length;
scores = arr[i].scores;

rows += "<tr>"
rows += "<td>" + arr[i].fn + "</td>"
rows += "<td>" + arr[i].ln + "</td>"

    for(j=0; j<scoreLen; j+=1) {
        rows += "<td>" + scores[j] + "</td>"
    }

rows += "<td>" + arraySum(arr[i].scores) + "</td>"
rows += "</tr>"

}

document.getElementsByTagName('body')[0].innerHTML = rows
console.log(rows)
}
2 голосов
/ 24 января 2012

Это будет перебирать свойства массива, кроме элементов массива, таких как length.Вы должны повторить, используя цикл for, как это:

for(var i = 0; i < students.length; i++) {
    ...
}
0 голосов
/ 24 января 2012

При переборе элементов массива никогда не используйте for .. in. Вместо этого всегда используйте числовой цикл, такой как:

for (var i=0, len=myArray.length; i<len; ++i){ … }

Или, если вы хотите повторить задний план с меньшим количеством набрав:

for (var i=myArray.length;i--;){ … }
...