javascript - 如何在 Javascript 中访问文本文件的数据?
问题描述
我正在尝试使用 Javascript 创建一个命令行待办事项列表。为此,我有两个文本文件 todo.txt 和 done.txt。添加待办事项后,应将其存储在 todo.txt 中,并在使用索引调用 done 函数后,应从 todo.txt 中删除相应的待办事项并将该待办事项存储在 done.txt 中。我创建了下面的程序来做同样的事情。但我收到一个错误:data.splice 不是函数,即对象:匿名。请告诉我我需要在下面的代码中进行哪些更改?
var fs = require('fs');
//constants
var todo_file = "todo.txt";
var done_file = "done.txt";
function init(){
if(!fs.existsSync(todo_file)){
console.log("Creating `todo.txt` file");
setTodo([]);
}
if(!fs.existsSync(done_file)){
console.log("Creating `done.txt` file");
setDone([]);
}
}
function getTodo(){
//read file contents
var contents = fs.readFileSync(todo_file);
return contents;
}
function getDone(){
//read file contents
var contents = fs.readFileSync(done_file);
return contents;
}
function setDone(data){
//write to file
fs.writeFileSync(done_file);
}
function setTodo(data){
//write to file
fs.writeFileSync(todo_file);
}
//display usage
function usage() {
console.log("Usage: done [add|check|delete|help] [task]");
console.log("`task` is only a string when using `add` and a number\nfor all other commands.");
console.log("Using the `done` without arguments lists all tasks");
}
//add task
function add(task) {
//get data
var data = getTodo();
//add item
data.push({task:task,completed:false});
//set data
setTodo(data);
//list
list();
}
//check task
function done(task) {
//get data
var data = getTodo();
var done = getDone();
//modify the data (toggle)
done = data.splice(task,task+1);
//set data
setTodo(data);
setDone(done);
//list
list();
}
//delete task
function del(task){
//get data
var data = getTodo();
//delete item
data.splice(task,task+1);
//set data
setTodo(data);
//list
list();
}
//list all tasks
function list() {
//data
var data = getTodo();
if(data.length > 0){
//print the list. using ANSI colors and formating
console.log("\x1b[93m\x1b[4mTask list:\x1b[24m");
data.forEach(function (task,index){
console.log(index+1+"."," ["+(task.completed ? "\x1b[92m✓\x1b[93m" : " ")+"] ",task.task);
});
}else{
console.log("\x1b[91mNo tasks added!!");
}
}
var command = process.argv[2];
var argument = process.argv[3];
init();
switch(command){
case "add":
add(argument);
break;
case "done":
done(argument-1);
break;
case "delete":
del(argument-1);
break;
case "help":
usage();
break;
case "list":
list();
break;
default:
console.log("\x1b[91mCommand not found!!\x1b[0m");
usage();
break;
}
解决方案
正如 Keith 所说,您不应该将 Javascript 数组直接存储在文件中,而应该序列化您的数据。JSON.stringify 和 JSON.parse 是序列化数据的好选择,因为它们是最简单的方法。
推荐阅读
- javascript - Vue.js 应该测试 main.js 文件吗?
- python - 如何在python 3中使用给定的两个页面输入搜索每个页面
- reactjs - 在 react-admin 中拥有多个 dataProviders 的正确方法是什么?
- html - 是否可以向 Folkloreatelier/laravel-graphql、graphql 服务器发送 HTTP POST 请求?
- java - 使用spring boot时如何通过在浏览器中点击URL来加载角度组件?
- c# - MVC 数据对其他客户端可见
- android - 搜索recyclerview位置错误
- javascript - Loopback validateUpsert 设置为 false 不起作用,仍然运行验证
- java - 如何将 kafka 消费者配置为仅在给定时间范围内收听消息
- r - 正则表达式提取空格和字符串之间的字符