如何从目录中读取文件并将内容推送到数组中?

How to read files from directory and push content into array?

import * as fs from 'fs';
const filesDir: string = './src/200k';

function uniqueValues() {
  let arr : string[] = [];

  fs.readdir(filesDir, function(err, files){
    files.forEach(function(file){
      fs.readFile(filesDir + '/' + file, 'utf8', function(err, data){
        arr.push(...data.toString().split("\n"));
      })
    })
  });

  return new Set(arr).size;
}

console.log(uniqueValues())

为什么 uniqueValues() return 是一个空数组? 有人可以解释一下吗?

fs.readdirfs.readFile 是异步函数。他们的操作结果只在他们的回调函数中可用。

这是您当前正在做的事情:

  1. 声明新的空数组arr
  2. 读取目录的内容,完成后,做其他事情
  3. return 基于先前声明的数组的新集合, 包含任何值(因此空数组 returned)。 (实际上,使用您当前的代码,您 return 设定了 Set 的大小,但我认为这是一个错字)。

所以基本上在你的情况下,你 return 一个空数组,而 NodeJS 正在读取一个目录和其他文件的内容,这些都丢失了...

如果您想 return 一个包含结果的数组,使用异步函数,您需要使用 promises 和 return 数组的 promise。

它应该是这样的:

import {readdir, readFile} from 'fs/promises';
const filesDir = './src/200k';

async function uniqueValues() {
  const files = await readdir(filesDir);
  const filesContent = await Promise.all(files.map((file) => {
    return readFile(filesDir + '/' + file, 'utf8');
  }));
  const arr = filesContent.reduce((acc, data) => {
    acc.push(data.toString().split('\n'))
    return acc;
  }, [])

  return new Set(arr);
}

uniqueValues().then((values) => {
  console.log(values);
})