待办事项数据模型
你将构建什么
一个待办事项数据模型:用对象表示单个待办(包含标题、完成状态、创建时间),用数组存储所有待办,实现添加、标记完成、删除和列出全部待办的功能。
学习目标
- 用对象结构化地表示一条待办事项
- 用数组管理多条待办事项
- 实现增、删、改、查四种基本操作
- 理解数据与展示分离的设计思路
前置要求
- 了解对象(键值对)和数组的概念
- 了解函数和循环
- 已完成前三个编程基础项目或具备同等基础
步骤
- 1
设计待办对象结构
一条待办事项需要哪些字段?至少包含:id(唯一标识)、title(标题)、completed(是否完成,布尔值)、createdAt(创建时间)。用伪代码定义这个对象结构。
代码// 单条待办事项的数据结构 todo = { id: 1, title: "学习编程基础", completed: false, createdAt: "2026-09-19" }预期结果
定义了一个包含四个字段的待办对象。
提示
id 用于唯一标识每条待办,方便后续删除和更新。completed 用布尔值比字符串更清晰。
- 2
用数组存储待办列表
声明一个空数组
todos = []来存放所有待办。编写addTodo(title)函数:创建一个新的待办对象,自动生成递增的 id,设置 completed 为 false,追加到数组末尾。代码todos = [] nextId = 1 function addTodo(title): todo = { id: nextId, title: title, completed: false, createdAt: today() } todos.push(todo) nextId = nextId + 1 print("已添加:" + title)预期结果
调用 addTodo(“买菜”) 后,todos 数组中多了一条待办。
提示
用 nextId 变量保证每条待办的 id 唯一且递增,比用数组长度更可靠。
- 3
实现标记完成和删除
编写
toggleTodo(id)函数:找到对应 id 的待办,把 completed 取反。编写deleteTodo(id)函数:从数组中移除对应 id 的待办。两个函数都要先检查 id 是否存在。代码function toggleTodo(id): for todo in todos: if todo.id == id: todo.completed = not todo.completed return print("找不到 id 为 " + id + " 的待办") function deleteTodo(id): for i in range(length(todos)): if todos[i].id == id: todos.remove(i) print("已删除待办 " + id) return print("找不到 id 为 " + id + " 的待办")预期结果
toggleTodo(1) 把第一条待办标记为完成;deleteTodo(1) 移除第一条待办。
提示
遍历数组找到匹配的 id,找不到时给出友好提示而不是静默失败。
- 4
实现列出全部待办
编写
listTodos()函数:遍历数组,打印每条待办的 id、状态标记([x] 表示完成,[ ] 表示未完成)和标题。最后统计并显示总数和已完成数。代码function listTodos(): if length(todos) == 0: print("暂无待办事项") return completedCount = 0 for todo in todos: mark = "[ ]" if todo.completed: mark = "[x]" completedCount = completedCount + 1 print(todo.id + ". " + mark + " " + todo.title) print("共 " + length(todos) + " 条,已完成 " + completedCount + " 条")预期结果
打印所有待办及完成状态,末尾显示统计信息。
提示
用 [x] 和 [ ] 作为状态标记,直观且容易理解。
- 5
测试完整流程
依次调用:添加三条待办、列出全部、标记第二条完成、列出全部、删除第一条、列出全部。确认每一步输出都符合预期。
代码addTodo("学习编程基础") addTodo("完成 Phase 7 项目") addTodo("复习 Git 命令") listTodos() toggleTodo(2) listTodos() deleteTodo(1) listTodos()预期结果
每次 listTodos 都正确反映当前状态,增删改查全部正常工作。
提示
这是集成测试——把所有功能串起来跑一遍,确保它们配合工作。
自己动手试试
let todos = [];
let nextId = 1;
function makeTask(id, title) {
// TODO: 返回一个待办对象
}
function addTodo(title) {
// TODO: 创建、追加、递增 id、返回
}
function toggleTodo(id) {
// TODO: 查找并翻转 completed
}
function listTodos() {
// TODO: 返回格式化字符串
}let todos = [];
let nextId = 1;
function makeTask(id, title) {
return { id, title, completed: false };
}
function addTodo(title) {
const task = makeTask(nextId, title);
todos.push(task);
nextId++;
return task;
}
function toggleTodo(id) {
const task = todos.find(t => t.id === id);
if (!task) return "找不到该待办";
task.completed = !task.completed;
return task;
}
function listTodos() {
return todos.map(t => `[${t.completed ? "x" : " "}] #${t.id} ${t.title}`);
}
addTodo("学习编程基础");
addTodo("完成 Phase 7 项目");
addTodo("复习 Git 命令");
toggleTodo(2);
console.log(listTodos());你学到了什么
你掌握了用对象建模现实实体、用数组管理集合数据,并实现了增删改查(CRUD)——这是几乎所有应用的数据操作基础。数据与展示分离的思路也为后续 Web 开发打下基础。
相关资源
相关练习
- 数据类型练习
测验数据类型相关知识。
相关工具
- JSON 格式化工具
待办数据用 JSON 表示,用此工具格式化查看。
相关参考文档
- JavaScript 数组方法
push、find、map 等模型中用到的方法。
- JavaScript 对象
对象属性访问和方法。
相关术语
新手友好的术语表用大白话解释编程术语——变量、函数、DOM、Promise 等等。
相关错误
用大白话解释常见错误——什么意思、为什么发生、如何修复。