2012-01-24 2 views
1

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

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) 
} 
+1

Вот [переписывание кода] (HTTP://jsfiddle.net/C38ny/) с использованием методов DOM для создания элементов вместо конкатенации строк и 'innerHTML'. –

+0

Я понимаю, что конкатенация строк и innnerHTML плохи? :) – jjhenry

+0

У меня есть сильная личная предвзятость в пользу использования методов DOM при работе в DOM. На мой взгляд, разметка принадлежит на сервере. Как только разметка прибыла и была переведена в DOM, нужно взаимодействовать с ней как DOM. Это не означает, что нет места для некоторой де-нормализации с использованием 'innerHTML', но я лично предпочитаю свести его к минимуму. * (Опять же, это мое личное предубеждение.) * –

ответ

2

Это итерацию по свойствам массива, кроме элементов массива, как length. Вы должны перебирать с помощью цикла, как это:

for(var i = 0; i < students.length; i++) { 
    ... 
} 
+0

На каком языке вы, по-вашему, пишете этот код? – Phrogz

+0

Я всегда код в make верить Языки –

2

Ниже правильная реализация 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) 
} 
+0

эта функция не работает для меня. он застрял здесь «rows + =» «+ arr [i] .fn +« » – jjhenry

+0

извинения, не знаю, что я делал раньше, но вы действительно работаете. :) – jjhenry

+1

@jjhenry: cool I didn ' t даже проверить это :) –

0

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

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

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

for (var i=myArray.length;i--;){ … } 
Смежные вопросы