从对象数组中的对象进行过滤

时间:2011-12-30 06:05:28

标签: javascript

我的数据结构如下所示

 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"}

2 个答案:

答案 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