我在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等其他帮助库的帮助。
答案 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)
您不需要任何外部库即可使用forEach
或filter
。为了便于阅读,我会分两步进行处理:
$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;
};