0

応答のリストを含む ans 配列を持つ変数 qstore があります。r という名前のフィールドは、応答データ (true または false) を保持するために使用され、 という配列に格納されます。ans

qstore: {"id":2,
         "qId":2,
         "ans":[{"r":true},
                {"r":true},
                {"r":false},
                {"r":false},
                {"r":false}]}

別の変数 qview:

qview: {"problemId":2,
          "questionId":1,
          "answer":null,
          "text":"xx",
          "answers":[{"answerId":1,
                      "response":false},
                     {"answerId":2,
                      "response":false},
                     {"answerId":3,
                      "response":false},
                     {"answerId":4,
                      "response":false},
                     {"answerId":5,
                       "response":false}]}

私がする必要があるのは、ansqstore で呼び出される配列がある場合 (存在しない可能性があります)、回答応答フィールドを取得し、それを使用して qview オブジェクトrの回答フィールドを更新する必要があります。responseqview と qstore に回答がある場合は、常に同じ数の回答があることに注意してください。

これを行う簡単な方法を誰か教えてもらえますか?

4

4 に答える 4

3

私がする必要があるのは、qstore に ans という配列がある場合 (存在しない場合もあります)、回答応答フィールド r を取得し、それを使用して qview オブジェクトの回答応答フィールドを更新する必要があります。qview と qstore に回答がある場合は、常に同じ数の回答があることに注意してください。

// assuming `qstore`, `qview`
var i, j, ans = qstore.ans;
if (ans) { // if qstore has non-falsy ans
    qstore: for (i = 0, j = 0; i < ans.length; ++i) { // loop over ans
        for (; j < qview.answers.length; ++j) { // look in qview
            if (qview.answers[j].answerId === i + 1) { // qview has already
                qview.answers[j].response = ans[i].r;
                continue qstore; // go back to looping ans
            } else if (qview.answers[j].answerId <= i) { // qview needs new
                break; // get out of qview loop
            }
        } // if we reach here then qview didn't have an entry for this item
        qview.answers.splice(j, 0, { // insert new entry
            'answerId': i + 1,
            'response': ans[i].r
        });
    }
}
于 2013-11-14T15:19:55.853 に答える
1

JavaScript には、オブジェクトにキーが存在するかどうかを確認する複数の方法があります:inおよび Object.hasOwnProperty. 2 つの違いは、キーがオブジェクトのプロトタイプ チェーンで見つかった場合にinも返されることです。true

これで、応答の ID のインデックスが 1 になっているように見えますが、配列自体の位置のインデックスを反復処理しても問題ありません。

if ('ans' in qstore) {
    for (var i = 0; i <= qstore.ans.length; i++) {
        qview.answers[[i].response = qstore.ans[i].r
    }
}

forEachIE8以前をサポートする予定がない場合、または「シム」を挿入する準備ができている場合は、より優れたものも利用できます。

if ('ans' in qstore) {
    qstore.ans.forEach(function(element, index) {
        element.response = qstore.ans[index].r
    })
}
于 2013-11-14T15:24:05.703 に答える