1

我的 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对象在控制台中显示为一堆垃圾,我无法从中访问任何信息。

范围或对象

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

4

2 回答 2

2

您已创建var Students = [];为数组,稍后将其用作关联数组来为其分配值:

Students[Student_ID] = obj;

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

var Students = {};

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

稍后,您可以for in使用 太安全地使用循环这些for in内容,并将其与对 hasOwnProperty 的调用结合使用:

for (var i in Students) {
    if (!Students.hasOwnProperty(i)) continue; // skip inherited properties
    // i == StudentID
    // Students[i] == your student object
}
于 2013-08-23T12:54:46.767 回答
2
Students[Student_ID] = obj;

大概是问题所在。

例如:

var arr = [];
arr[4] = {};
=>
[undefined × 4, Object]
于 2013-08-23T12:52:17.643 回答