1

JavaScript コードの 2 つのオブジェクトに問題があります。

私の最初のオブジェクトは、ここにリストしていない API 呼び出しからのものですがdata、関数に渡される変数はその API 呼び出しの結果であり、その出力は強調表示された下の[1]getStudentStats()の画像で見ることができます。これは、学生とその関連データのリストです。

私の 2 番目のオブジェクトは、以下に示す 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安全に使用し、 hasOwnPropertyfor inの呼び出しと組み合わせることができます。

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 に答える