切换所有在我的待办事项列表上不起作用的功能

时间:2019-04-22 22:02:17

标签: javascript

除了切换全部功能,我的代码正常运行;它什么都不做。没有错误消息

我已经多次读取证明,并尝试使用布尔值替换true和false。什么都没用。以下是什么都不做的部分: *这个。参考待办事项清单。 “ todos”是具有两个属性的对象:1. Todo Text,2.完成状态。

代码的其余部分已经有一个for循环,用于将待完成的todo函数显示为已完成或由“(x)”表示的已完成和已完成的todos函数。 待办事项名称旁边的“()”不完整。

toggleAll: function() {
  var totalTodos = this.todos.legth;
  var completedTodos = 0;
  for (var i = 0; i < totalTodos; i++) {
    if (this.todos[i].completed === true) {
      completedTodos++;
    }
  }
  if (completedTodos === totalTodos) {
    for (var i = 0; i < totalTodos; i++) {
      this.todos[i].completed = false;
    }
  } else {
    for (var i = 0; i < totalTodos; i++) {
      this.todos[i].completed = true;
    }
  }
  this.displayTodos();
};

如果任何待办事项不完整,则应将所有待办事项切换为已完成,如果所有待办事项已完成,则应将所有待办事项切换为未完成。而是,该列表与执行toggleAll之前的列表相同。没有错误消息。

2 个答案:

答案 0 :(得分:0)

如果您的代码中确实有this.todos.legth的错字,您将不一定会看到错误消息,因为它只会返回undefined而不是抛出某种“找不到属性”您可能会用其他语言看到的例外。

this.todos = ["some", "objects", "go", "here"];
console.log(this.todos.legth); // returns undefined
console.log(this.todos.length); // returns 4

然后,您的所有其他循环将无济于事,因为它们要么迭代到最大值undefined,要么创建诸如completedTodos === totalTodos-> 0 === undefined之类的条件。

这是固定代码。

toggleAll: function() {
    var totalTodos = this.todos.legth;
    var completedTodos = 0;
    for (var i = 0; i < totalTodos; i++) {
        if (this.todos[i].completed === true) {
            completedTodos++;
        }
    }
    if (completedTodos === totalTodos) {
        for (var i = 0; i < totalTodos; i++) {
            this.todos[i].completed = false;
        }
    } else {
        for (var i = 0; i < totalTodos; i++) {
            this.todos[i].completed = true;
        }

    }
    this.displayTodos();
}
};

答案 1 :(得分:0)

有些事情,您的代码不正确,因为

var totalTodos = this.todos.legth

不起作用。您也可以简化您的代码。.我假设totalTodos是一个数组。考虑使用内置的Array函数,例如过滤器,地图。

例如

toggleAll: function() {
    const totalTodos = this.todos.length;
    const todos = this.todos;

    // (1) find out if all are completed using filter
    const areAllCompleted = todos.filter(e => e.completed).length === 
    totalTodos; 

    // (2) Flip all items using Array.map
    this.todos = todos.map(i => {...i, complete: !areAllCompleted })

  this.displayTodos();
};

希望所建议的代码更容易阅读,并向您介绍以下内容

...

Array.map

Array.filter

!运算符

退房 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax#Spread_in_object_literals

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter