2016-08-13 11 views
1

オブジェクトの配列を表示して動的に更新するのは苦労しています。再帰関数を使用して配列を動的に更新する

予想される出力は、5秒ごとに更新される生徒オブジェクトの配列になります。意味新しい生徒objが配列に追加されます。

これは私の関数である:

var students = []; 

function getStudents() { 
    var student = {}; 
    student.name = 'example name'; 
    student.id = 1; 
    students.push(student); 
    // recursive 
    setTimeout(getStudents, 5000); 
    return students; 
} 

getStudents(); 

は、今のところは、アレイ内のオブジェクトを作成しますが、停止します。どうすればこの作品を作れますか?私は間違って何をしていますか?

Fiddle hereを例示する。

は、アレイ内のオブジェクトを作成しますが、停止した今

+0

コードは正常に動作します。各配列ではなく、最初の反復の後でのみ配列を記録します。 – lexith

答えて

1

再び、出力を収集するために<div id="test">要素を追加しました。

<div id="test"> 
</div> 

いくつかの配列を作成して、データを操作しました。

// Here's an array of students we can add for test purposes... 
    // 
    var arrStudents = [ "Rita", "Sue", "And", "Bob", "too" ]; 
    var arrIDs = [ 123, 234, 345, 456, 567 ]; 

    // We can populate 5 students with the above data, this will 
    // keep track of the number of students added. 
    //  
    var intStudents = 0; 

    var students = []; 

私は再帰的にgetStudents()関数によって呼び出される関数updateTest()を作成しました:

function updateTest() { 
     var a; 

     document.getElementById('test').innerHTML = ""; 

     for (a = 0; a < students.length; a++) { 
      // Append the output to innerHTML 
      // 
      document.getElementById('test').innerHTML += 
       a.toString() + 
       ": Student name: " + students[a].name + 
       ", ID: " + students[a].id + "<br />"; 
     } 
    } 

は今getStudents()関数が呼び出されるupdateTest()たびに呼び出して、あなたは学生のリストが育つ表示されます。

function getStudents() { 
     var student = {}; 

     if (intStudents < 5) { 
      // Add one of the students from our arrays. 
      // 
      student.name = arrStudents[intStudents]; 
      student.id = arrIDs[intStudents]; 
     } 
     else { 
      // Just keep adding this when we run out of students. 
      // 
      // We can still use intStudents to generate a unique 
      // name and id. 
      // 
      student.name = 'example name ' + intStudents.toString(); 
      student.id = intStudents; 
     } 

     intStudents++; 

     students.push(student); 

     // recursive 
     setTimeout(getStudents, 5000); 

     // call updateTest() each time to update the div... 
     // 
     updateTest(); 
    } 

    getStudents(); 
+0

Doh!内側のhtmlに追加する代わりに、私は学生を返すことができますか?つまり、「帰国学生」、「いつでも必要な場所で活用する」。 – Modelesq

+0

あなたは確かに、世界はあなたの牡蠣です!または、この場合、オブジェクト。 – Nunchy

+0

ニース!残念ながら、私の編集をチェックアウトすると、まだ配列内のオブジェクトが返されます。 – Modelesq

0

(事前にご協力いただきありがとうございます)。

問題はconsole.log(students)が再帰関数呼び出しの外部で一度呼び出されています。あなたが唯一の最初の呼び出しの後に一度ログインしているconsole.log(students)

function getStudents() { 
    var student = {}; 
    student.name = 'example name'; 
    student.id = 1; 
    students.push(student); 
    console.log(students); 
    // set recruive 
    setTimeout(getStudents, 5000); 
} 

再帰関数内jsfiddle https://jsfiddle.net/88r0rj8n/3/

+0

意味があります。ここでリターン関数は適切でしょうか?私はOPを更新しました。それをチェックしてください。 – Modelesq

+0

@Modelesq 'return'どのような値ですか?価値はどこに返されますか? 'setTimeout'はクリアされていますか? – guest271314

+0

学生の配列。 'var studentList = getStudents();'を呼び出し、配列を常に更新したい場合 – Modelesq

0

が含まれます。関数内にconsole.logを移動すると、5秒ごとに要素が1つ増えてログに記録されます

+0

もし私がstudents配列を取得したいのであれば、 'return'が動作するでしょうか? – Modelesq

+0

これはすでに動作していますが、students配列を返す必要はありません。 – Robbie

+0

getStudents()を呼び出したい場合は、他のモジュールでは、私は学生の配列を返すことができるようにしたいと思います。はいconsole.log()は関数内で動作しますが、students配列を返すことができます。 – Modelesq

関連する問題