如何只获取数组中以 "x" 或 "y" 结尾的元素?

How do I get only the elements from an array that end with "x" or "y"?

我有一个函数可以递归地在目录中搜索文件,然后 returns 将它们作为一个数组。我只想要以“.js”或“.ts”结尾的文件。为此,我正在尝试使用 Array.filter()。但是,这看起来好像行不通,因为只返回以“.js”结尾的文件。如何只过滤以“.js”或“.ts”结尾的文件?

function getFiles(dir: string): string[] {
    let files: string[] = [];
    fs.readdirSync(dir).forEach((file) => {
        if (fs.statSync(path.join(dir, file)).isDirectory()) {
            files = files.concat(getFiles(path.join(dir, file)));
        } else {
            files.push(path.join(dir, file));
        }
    });
    return files;
}

const files = getFiles(path.join(__dirname, "xyz")).filter((file) => file.endsWith(".js" || ".ts"));

为什么不使用现有的包,比如 rrdir

这负责匹配(和排除)。它还处理错误,以及是否应遵循符号链接。

那么就和

一样简单
const rrdir = require("rrdir");
const opts  = { include: [ '**/*.{js,ts}' ] };

for await ( const entry of rrdir( 'path/to/root' , opts ) ) {
  // => { path: 'path/to/root/. . ./file', directory: false, symlink: false }
}

或者,如果您愿意等待整棵树被收集后再取回任何东西:

const rrdir = require('rrdir');
const opts  = { include: [ '**/*.{js,ts}' ] };
const files = rrdir.sync( 'path/to/root', opts ) ;

".js" || ".ts" 的计算结果为 .js。不幸的是你不能通过这样的条件。在浏览器控制台中尝试 运行 ".js" || ".ts" 查看。

正确的版本是:

const files = getFiles(path.join(__dirname, "xyz"))
  .filter(file => file.endsWith(".js") || file.endsWith(".ts"));

或者:

const files = getFiles(path.join(__dirname, "xyz"))
  .filter(file => file.match(/(j|t)s$/);