[英]How can I pick data out of an array in a object and insert it into another array in an object in Javascript?
我有一个变量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}]}
我需要做的是,如果在qstore中有一个称为ans
的数组(可能没有一个),那么我需要获取答案响应字段r
并使用它来更新qview对象中的答案response
字段。 请注意,如果qview和qstore确实有答案,则它们将始终具有相同数量的答案。
谁能告诉我我可以做到的简单方法?
我需要做的是,如果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
});
}
}
只需简单地循环遍历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;
}
}
最简单的解决方案。
这样一来,只有在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;
}
}
}
JavaScript有多种方法来检查对象中是否存在键: in
和Object.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
}
}
如果您不希望支持IE8和更早版本,或者准备插入“ shim”,也可以使用forEach
更好的方法:
if ('ans' in qstore) {
qstore.ans.forEach(function(element, index) {
element.response = qstore.ans[index].r
})
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.