这是范围问题还是我错误地设置了我的对象数组?

时间:2013-08-23 12:43:32

标签: javascript

我的javascript代码中有两个对象存在问题。

我的第一个对象是来自我未在此处列出的API调用,但传递到我的data函数的getStudentStats()变量是该API调用的结果,可以看到其输出在下图突出显示 [1] 。这是学生及其相关数据的列表。

我的第二个对象是JSON调用的结果,可以在下面看到(UWA.Data.getJson()函数)。它的输出可以在下面突出显示的图像中看到 [2] 。这是学生的ID列表和我当地数据库的一些统计数据,即他们收到的标志数量以及为他们筹集的干预数量。

getStudentStats : function(data) {

    /* [1] Console log */
    console.log(data);

    var student_list = '';

    for( var i = 0; i < data.length; i++ )
        student_list += data[i].id + ',';

    student_list = student_list.substring(0, student_list.length - 1);

    var Students = [];
    var Student_Data = data;

    UWA.Data.getJson(FLAGS_Assign_Flags.url + 'get_students_stats&arg=' + student_list, function(data) {
        /* [2] Console log */
        console.log(data);

        for( var i = 0; i < data.length; i++ ) {
            var Student_ID = data[i].Student_ID;
            var obj = { 'flags': data[i].Flags, 'interventions': data[i].Interventions };
            Students[Student_ID] = obj;
        }

        /* [3] Console log */
        console.log(Students);

        FLAGS_Assign_Flags.displayStudents(Students, Student_Data);
    });

},

我要做的是,基本上,显示来自这两个对象的一些信息(使用jQuery .html()和字符串变量)。

displayStudents : function(students, data) {

    /* Set up our HTML variable which we'll .html() when it's populated */
    var StudentsHTML = '<ul id="students_display">';

    for( var i = 0; i < data.length; i++ ) {
        /* For each student in the `data` object, grab their ID to access the correct element in the students object */
        var id = data[i].id;

        /* Set up a variable which we'll use to display the students' stats in our LI */
        var stats = '<div>';

        /* If the student doesn't have any flags or interventions, manually set the text */
        if( typeof students[id] != 'undefined' )
            stats += ' (F:<span class="f">' + students[id].Flags + '</span>|I:<span class="i">' + students[id].Flags + '</span>)';
        else
            stats += ' (F:<span class="f">0</span>|I:<span class="i">0</span>)'; 

        stats += '</div>';

        /* Produce checkbox, name and stats for each student and add them to the HTML variable */
        StudentsHTML += '<li><input type="checkbox" name="students" value="' + data[i].id + '" />&nbsp;' + data[i].firstname + ' ' + data[i].surname + stats + '</li>';
    }

    StudentsHTML += '</ul>';

    /* Set the HTML... */
    $('#students').html(StudentsHTML);

    /* Do some other stuff not relevant to this question! */
    FLAGS_Assign_Flags.displayForm();

},

问题是,正如您在下面的图片中看到的那样突出显示 [3] ,我的Students对象在控制台中显示为垃圾加载,我无法访问任何信息从它。

Scope or object

这是一个范围问题,还是我错误地设置了我的对象数组?

2 个答案:

答案 0 :(得分:2)

Students[Student_ID] = obj;

可能是问题。

例如:

var arr = [];
arr[4] = {};
=>
[undefined × 4, Object]

答案 1 :(得分:2)

您已将var Students = [];创建为数组,稍后将其用作关联数组,以便为​​其指定值:

Students[Student_ID] = obj;

这不起作用,您应该将Students var创建为对象:

var Students = {};

Javascript没有'关联数组'的概念,你应该为此目的使用基本对象。

稍后,您可以使用for in循环使用for in,使用for (var i in Students) { if (!Students.hasOwnProperty(i)) continue; // skip inherited properties // i == StudentID // Students[i] == your student object } ,将其与call to hasOwnProperty结合使用:

{{1}}