对于循环数组不会返回正确的结果

时间:2015-12-17 09:38:52

标签: javascript angularjs

在使用for循环后,我正在使用if语句将变量与数组进行比较:$scope.object.id$scope.groepen.id。如果$scope.object.id$scope.groepen.id的其中一个ID完全相同,那么它应该使$scope.overlap的索引为true。

如果检查$scope.overlap是否为真,我正在使用另一个。如果$scope.overlap的一个元素为真,则$scope.bestaand为真。否则它应该是假的。

for (var i = 0; i < $scope.groepen.length; i++) {
  if ($scope.object.id === $scope.groepen[i].id) {
    $scope.overlap[i] = true;
    if ($scope.overlap[i]) {
      $scope.bestaand = true;
    }
    else {
      $scope.bestaand = false;
    }
  }
  else {
    $scope.overlap[i] = false;
  }
}

我的控制台日志向我显示$scope.overlap确实显示了正确的值(因此,如果没有相同的内容,则所有索引都为false)。如果某些东西是相同的,$scope.bestaand确实变为真,但它不会变回假。

我正在使用Angular表单验证来显示检查是否正常工作:

<div class="col-md-3" ng-class="{ 'has-error' : bestaand }">
    <label class="control-label" for="textinput">Groepsnaam</label> 
    <input id="groepen" name="groepen" type="text" class="form-control input-md" ng-model="object.id" ng-minlength="4" ng-maxlength="16" ng-change="checkOverlap()" required>
    <p ng-show="bestaand" class="help-block">Deze groepsnaam bestaat al!</p>                            
</div>

我在这里做错了什么?

编辑:

我已经改变了我的if语句的位置。更新后的代码如下:

for (var i = 0; i < $scope.groepen.length; i++) {
  if ($scope.object.id === $scope.groepen[i].id) {
    $scope.overlap[i] = true;
  }
  else {
    $scope.overlap[i] = false;

  }
  if ($scope.overlap[i]) {
      $scope.bestaand = true;
      console.log("works")
  }
  else {
    $scope.bestaand = false;
    console.log("doesnt work")
  }
}

控制台日志向我显示:

enter image description here

它似乎确实成了现实,但它被覆盖(我输入的值与数组的第二个值相同)。如果我输入的值与数组的最后一个值相同,则确实有效。

3 个答案:

答案 0 :(得分:3)

您的问题是,if ($scope.overlap[i]) {if ($scope.object.id === $scope.groepen[i].id) {内已$scope.overlap,所以$scope.bestaand将永远为真。这意味着true只能设置为undefined或保留为for (var i = 0; i < $scope.groepen.length; i++) { if ($scope.object.id === $scope.groepen[i].id) { $scope.overlap[i] = true; } else { $scope.overlap[i] = false; } if ($scope.overlap[i]) { $scope.bestaand = true; } else { $scope.bestaand = false; } } 。你真正想要的是 -

$scope.bestaand

修改 如果您想将$scope.overlap元素设置为真,那么您需要一些不同的东西 -

$scope.bestaand = false;
for (var i = 0; i < $scope.groepen.length; i++) {
  if ($scope.object.id === $scope.groepen[i].id) {
    $scope.overlap[i] = true;
  }
  else {
    $scope.overlap[i] = false;
  }
  if(!$scope.bestaand) {
    if ($scope.overlap[i]) {
      $scope.bestaand = true;
    }
  }
}

答案 1 :(得分:1)

这是因为 else 语句无法访问:

$scope.overlap[i] = true;

if ($scope.overlap[i]) {
  $scope.bestaand = true;
}
else {
  console.log('UNREACHABLE');
  $scope.bestaand = false;
}

至于你编辑过的问题:

你的$scope.bestaand表示错误,所以我认为如果它永远不是真的那就是假的。

所以你需要按如下方式重写你的循环:

$scope.bestaand = false;
for (var i = 0; i < $scope.groepen.length; i++) {
  if ($scope.object.id === $scope.groepen[i].id) {
    $scope.overlap[i] = true;
  } else {
    $scope.overlap[i] = false;
  }

  if ($scope.overlap[i] && !$scope.bestaand) {
    $scope.bestaand = true;
  }
}

答案 2 :(得分:0)

因为没有你把它设置为false的情况。 if ($scope.object.id === $scope.groepen[i].id)为真,那么您已设置overlap = true,如果重叠为假,则无论如何都不设置bastaan = false