我的数据结构如下所示
var data = {"Questions" : [
{"QID":"Q1","S":"2"},
{"QID":"Q2","T":"12"},
{"QID":"Q3","U":"22"}], // Also please suggest me to improve this to make parsing easier
"Share" : "Yes"
};
for(var item in data.Questions)
{
if(this.QID == "Q2") // this.QID returns me undefined
{
// I want to retrieve the total object i.e
// {"QID":"Q2","T":"12"} should be returned
}
}
为什么this.QID
会给我undefined
?如何检索总对象,即{"QID":"Q2","T":"12"}
?
答案 0 :(得分:1)
将迭代代码更改为:
var questions = data.Questions;
for (var i = 0; i < questions.length; i++) {
if (questions[i].QID == "Q2") {
// questions[i] is all the data of this array element
}
}
不应使用for (x in array)
迭代数组。这种类型的迭代迭代了对象属性,它也会拾取数组元素,但不建议这样做。在现代浏览器中使用数组索引或.forEach()
以可预测的顺序迭代数组,并且迭代中不会显示任何其他属性。
此外,您尝试进行迭代的方式不会将this
设置为任何内容,因此您无法使用它来访问数组元素。
答案 1 :(得分:1)
Don't iterate Arrays using for .. in
loops。使用常规for
循环或Array.forEach()
*。
除此之外,this
不将成为您的数组中的项目。你需要:
if (data.Questions[item].QID == "Q2") {
...
}
使用常规for
循环:
for (var i = 0; i < data.Questions.length; i++) {
if (data.Questions[i].QID == "Q2") {
...
}
}
或者,我首选的方法Array.forEach()
:
data.Questions.forEach(function (item) {
if (item.QID == "Q2") {
...
}
});
*较旧的浏览器本身不支持Array.forEach()
,但您可以自行添加。有关可在旧代浏览器的代码中使用的实现,请参阅compatibility notes。