【问题标题】:How to access data of text files in Javascript?如何在 Javascript 中访问文本文件的数据?
【发布时间】:2020-12-20 15:25:26
【问题描述】:

我正在尝试使用 Javascript 创建命令行待办事项列表。为此,我有两个文本文件 todo.txt 和 done.txt。添加 todo 后,它应该存储在 todo.txt 中,并且在使用索引调用 done 函数后,它应该从 todo.txt 中删除相应的 todo 并将该 todo 存储在 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;
} 

【问题讨论】:

  • 您不能将 Javascript 数组直接存储在文件中,您需要对数据进行序列化。使用 JSON.stringify 和 JSON.parse 将数据序列化到您的文件系统。附言。序列化数据的方法有很多,JSON 是最简单的。

标签: javascript text command-line


【解决方案1】:

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

【讨论】:

  • 我已经修改了我的代码。你能检查一次并告诉我应该如何编写以索引为参数的删除函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多