nodeschool learnyounode node.js模块FILTER LS练习

时间:2014-06-04 16:11:58

标签: node.js

以下是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验证输出实际结果与预期结果不匹配时

不知道我哪里出错了。有人可以给我解决方案PLZ ???

8 个答案:

答案 0 :(得分:2)

你的问题只是一个错字。你这样做了:

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

,但你应该这样做:

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

其他事情:他们未考虑输入中.的{​​{1}},因此您必须将此附加到变量.txt中,因为ext1会返回使用.extname(file)

的扩展
.

答案 1 :(得分:2)

这是官方解决方案:

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 :(得分:0)

您可以尝试使用此代码来解决此问题:

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]);
        }
    }
});

答案 3 :(得分:0)

以下是我提出的建议:

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]);
    }
}
});

答案 4 :(得分:0)

如果您想要解决问题的其他解决方案,请提供我想出的内容:

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
      }
    });
  }
});

答案 5 :(得分:0)

代码中唯一缺少的是&#39;的连接。&#39;在文件扩展名类型之前。

  

var extension =&#39;。&#39; + process.argv [3];

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

答案 6 :(得分:0)

这就是我如何解决它

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)

答案 7 :(得分:0)

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

-Import fs module

    var fs = require('fs');

- 从cmd行

中提取所需的路径和ext名称
    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]);
      }
    });