如何在函数调用中清除所有已完成的任务?

时间:2017-07-13 20:39:28

标签: javascript angularjs

我在Angular工作,我有复选框切换布尔值(表示任务完成)。我还有两个数组,一个用于保存对象列表,另一个用于在完成并清除后保存第一个键值。

$scope.taskList = [{
  complete: false,
  foo: "1",
  bar: "2",
  baz: "3"
}];

$scope.completedTasks = [];

当只检查一个或两个时,以下功能可以正常清除任务;但是,当检查的项目数量增加时,只有部分已检查项目会清除;如果你继续调用该函数,最终所有任务都会清除,但我无法弄清楚如何一举清除整个列表。

$scope.clearComplete = function() {
  for (var i = 0; i < $scope.taskList.length; i++) {
    if ($scope.taskList[i].complete == true) {
      $scope.completedTasks.push($scope.taskList[i].foo);
      $scope.taskList.splice(i, 1);
    }
  }
  console.log($scope.completedTasks);
  return $scope.taskList;
};

我对如何纠正逻辑感到茫然,并希望一些新鲜的眼睛能够帮助我。

对于这个项目,我试图保持低依赖性,没有Underscore和Lodash等其他帮助库的帮助。

2 个答案:

答案 0 :(得分:2)

首先,如果您正在执行taskList.splic,那么请向后循环。 否则你可以这样做:

var incompleteTasks = [];
$scope.tasks.forEach(function(task){
    if(task.complete) {
        $scope.completedTasks.push(task.foo);
    } else {
        incompleteTasks.push(task);
    }
});
$scope.tasks = incompleteTasks;

所以,你将只对你的数组进行一次迭代,并以更清晰的方法实现它。

答案 1 :(得分:1)

您不需要任何外部库即可使用forEachfilter。为了便于阅读,我会分两步进行处理:

$scope.clearComplete = function() {

  //push completed tasks to completedTasks
  $scope.taskList.forEach(function(t) {
    if(t.complete) {
      $scope.completedTasks.push(t.foo);
    }
  });

  //then filter the task list
  $scope.taskList = $scope.taskList.filter(function(t) {
    return !t.complete;
  });

  console.log($scope.completedTasks);
  return $scope.taskList;
};