【问题标题】:nodeschool learnyounode node.js module FILTER LS exercisenodeschool learnyounode node.js 模块 FILTER LS 练习
【发布时间】:2018-06-15 15:35:25
【问题描述】:

下面是nodeschool learnyounode模块的练习5

创建一个程序,打印给定目录中的文件列表,按文件扩展名过滤。您将获得一个目录名称作为程序的第一个参数(例如/path/to/dir/)和一个文件扩展名作为第二个参数进行过滤。

例如,如果您将 'txt' 作为第二个参数,则您需要将列表过滤为仅以 .txt 结尾的文件。

文件列表应该打印到控制台,每行一个文件,并且必须使用异步 I/O。

var fs = require('fs');
var path = require('path');
var mydir = process.argv[2];
var ext1 = process.argv[3]
fs.readdir(mydir, function(err, files){
  if(err){
    throw err
  }
  //console.log(files);
  files.forEach(function(filename){
    var ext = path.extname(filename);
    if(ext == ext1){
      console.log(filename);
    }
  });
});

当我运行它时,我得到了正确的输出,但是当我使用 learnyounode 验证输出时,实际结果与预期结果不匹配

不知道我哪里出错了。有人可以给我解决办法吗??

【问题讨论】:

    标签: node.js


    【解决方案1】:

    这是官方的解决方案:

    var fs = require('fs')
    var path = require('path')
    
    fs.readdir(process.argv[2], function (err, list) {
      list.forEach(function (file) {
        if (path.extname(file) === '.' + process.argv[3])
          console.log(file)
      })
    })
    

    【讨论】:

      【解决方案2】:

      您的问题只是一个错字。你正在这样做:

          if(ext == ext){ // you're comparing the same variable
            console.log(filename);
          }
      

      ,但你应该这样做:

          if(ext === ext1){ // try to use '==='
            console.log(filename);
          }
      

      其他事情:他们没有考虑输入中的.txt.,因此您必须将其附加到变量ext1 中,因为.extname(file) 返回带有. 的扩展:

      var ext1 = '.' + process.argv[3];
      

      【讨论】:

      • 对不起,我在这里打错了。即使是 ext1,虽然我得到了输出,但我无法完成练习。有什么建议吗?
      • 请参阅我回答的第二部分,了解您如何设置 ext1 var。也许这就是你的问题:你没有考虑.
      【解决方案3】:

      你可以试试这个代码来解决这个练习:

      var fs = require('fs');
          function endsWith(str, suffix) {
              var s = str.slice(str.length - suffix.length - 1);
              if (s == "." + suffix)
                  return true;
              else
                  return false;
      };
      
      
      fs.readdir(process.argv[2], function (err, list) {
          if (process.argv[3]) {
              for (var i = 0; i < list.length; i++) {
                  if (endsWith(list[i], process.argv[3]))
                      console.log(list[i]);
              }
          }
      });
      

      【讨论】:

        【解决方案4】:

        这是我想出的:

        var fs = require('fs');
        var filePath = process.argv[2];
        var fileType = '.' + process.argv[3];
        
        fs.readdir(filePath, function(err, list) {
        for(var i=0; i<list.length; i++){
            if (list[i].match(fileType)) {
                console.log(list[i]);
            }
        }
        });
        

        【讨论】:

          【解决方案5】:

          以下是我想出的,如果您想要其他解决问题的方法:

          var fs = require('fs');
          var path = process.argv[2]; //first argument
          var extension = process.argv[3]; //second argument
          var re = new RegExp("."+extension, "g"); //a regexp that matches every string that begins with a dot and is followed by the extension, i.e. .txt
          
          fs.readdir(path, function callback(err, list){ //read the directory
            if (!err) { //if no errors occur run next funtion
              list.forEach(function(val) { //take the list and check every value with the statement below
                if(re.test(val)) { //if the .test() rexexp-function does not match it will return a false, if it does it will return true
                  console.log(val); //if it matches console log the value
                }
              });
            }
          });
          

          【讨论】:

            【解决方案6】:

            您的代码中唯一缺少的是 '.' 的串联。在文件扩展名类型之前。

            var extension = '.'+ process.argv[3];

            然后您可以进行比较和打印。

            【讨论】:

            • 那是引用,而不是代码块。代码应缩进 4 个空格,而不是大于 (>) 符号。
            【解决方案7】:

            我就是这样解决的

            var fs = require('fs');
            const path = require("path")
            
            var dir = process.argv[2],
                ext = "."+process.argv[3];
            function borer(callback){
                fs.readdir(dir,function(err,list){
                    if(err){
                        console.log(err) 
                    }else{
                        var row = list.filter((a)=>{
                            var regexp = new RegExp(ext+"$","ig") 
                            if( a.search(regexp) > -1 ){
                                callback(a)
                            }
                        })
            
                    }
                })
            }
            function print(f){
                console.log(f)
            }
            
            borer(print)
            

            【讨论】:

            • 最好加个解释;不只是提供原始代码。
            【解决方案8】:

            给出的解决方案使用 Node JS 包中的路径模块。下面的解决方案不使用路径,而是依赖于对给定文件名的简单解构并使用所需的部分。

            -导入fs模块

                var fs = require('fs');
            

            -从命令行中提取所需的路径和分机名称

                let filePath = process.argv[2];
                let extName = process.argv[3];
            

            - 使用 (readdir) 方法读取目录的内容。目录内的文件名会以数组的形式返回。

                fs.readdir(filePath, 'utf-8', function(err, data) {
                  if (err) throw err;
            
                  data.forEach(element => {
            

            -取出每个元素并将其拆分为文件名和扩展名

                  let temp = element.split('.');
                  let tempSplit = temp[1];
                  if(tempSplit === extName) {
                    console.log(temp[0] + '.' + temp[1]);
                  }
                });
            

            完整代码供参考:

                var fs = require('fs');
            
                let filePath = process.argv[2];
                let extName = process.argv[3];
            
                fs.readdir(filePath, 'utf-8', function(err, data) {
                  if (err) throw err;
            
                  data.forEach(element => {
                  let temp = element.split('.');
                  let tempSplit = temp[1];
                  if(tempSplit === extName) {
                    console.log(temp[0] + '.' + temp[1]);
                  }
                });
            

            【讨论】:

              猜你喜欢
              • 2020-01-13
              • 2013-09-17
              • 2016-01-16
              • 2021-08-27
              • 1970-01-01
              • 2013-05-04
              • 1970-01-01
              • 2015-05-01
              • 2015-12-05
              相关资源
              最近更新 更多