首页 > 解决方案 > 如何在 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;
} 

标签: javascripttextcommand-line

解决方案


正如 Keith 所说,您不应该将 Javascript 数组直接存储在文件中,而应该序列化您的数据。JSON.stringify 和 JSON.parse 是序列化数据的好选择,因为它们是最简单的方法。


推荐阅读