0

我有一个变量 qstore,它有一个包含响应列表的 ans 数组。名为 r 的字段用于保存响应数据(真或假),并存储在名为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}]}

我需要做的是如果ans在 qstore 中有一个称为数组(可能没有),那么我需要获取答案响应字段r并使用它来更新responseqview 对象中的答案字段。请注意,如果 qview 和 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 回答
2

只需简单地遍历qstore.ans数组(如果存在)并在qview.

if(qstore.hasOwnProperty('ans')){
    for(var i = 0, len = qstore.ans.length; i < len; i++){
        qview.answers[i].response = qstore.ans[i].r;
    }
}
于 2013-11-14T15:17:12.947 回答
1

JavaScript 有多种方法来检查对象中是否存在键:inObject.hasOwnProperty. 两者之间的区别在于,如果在对象的原型链中找到键,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
    }
}

forEach如果您不希望支持 IE8 和更早版本,或者准备插入“shim”,还有一个更好的可用:

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

最简单的解决方案。

这样,只有当您在ans数组上有 1 个寄存器时,它才会执行,我看到上面的解决方案不会验证ans数组是否有寄存器,所以我认为它适合您的情况。

这是代码:

if (qstore.ans != null){
    if (qstore.ans.length > 0){
        for (i=0;i<qstore.ans.length);i++){
            qview.answers[i].response = qstore.ans[i].r;
        }
    }
}
于 2013-11-14T15:20:57.403 回答