为什么for..in()循环不返回数组内的对象?

时间:2014-03-23 10:52:36

标签: javascript arrays angularjs

我在角度控制器中有这段代码,看起来像这样:

for (var obj in $scope.items) {
   obj.done = false;
}

以下是我的$scope.items外观:

$scope.items = [
  {
    name: "Task #1",
    done: false
  },
  {
    name: "Task #2",
    done: false
  }
];

对我而言,我的for循环实际上不起作用似乎很奇怪。 obj不是循环中的对象。我试图对console.log变量进行obj,并打印出数组$scope.items的索引。为什么会这样?由于这是foreach循环,obj内的每个对象都不应$scope.items吗?

3 个答案:

答案 0 :(得分:4)

for .. in遍历键(或索引),而不是值。你应该这样做:

for (var index in $scope.items) {
    $scope.items[index].done = false;
}

通常,使用for .. in迭代数组会被视为a bad practice。您可以改为使用forEach方法:

$scope.items.forEach(function (item) {
    item.done = false;
});

答案 1 :(得分:4)

对象的

for..in enumerates the property names

var foo = { a: 5, b: 7 };
for (var x in foo) {
    console.log(x);
}
// -> a
// -> b

如果您想要属性 values ,只需使用名称在对象中查找属性:

var foo = { a: 5, b: 7 };
for (var x in foo) {
    var value = foo[x];
    console.log(value);
}
// -> 5
// -> 7

但是对于数组,使用其属性迭代其元素并不是一个好主意。如果向数组添加常规属性,例如:

var arr = [ 1, 2, 3 ];
arr.myProp = "someValue";

然后myProp也会显示在for..in循环中,这通常是不需要的。相反,强烈建议使用常规 for循环或使用Array.forEach迭代数组:

arr.forEach(function(value, index) {
    console.log(value);
})
// -> 1
// -> 2
// -> 3

答案 2 :(得分:0)

for..in做的是迭代对象的属性或属性,而不是数组的元素。如果要迭代数组,则应使用普通for循环for(var i =0; i<n; i++)..