如何从目录中读取文件并将内容推送到数组中?
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.readdir
和 fs.readFile
是异步函数。他们的操作结果只在他们的回调函数中可用。
这是您当前正在做的事情:
- 声明新的空数组
arr
- 读取目录的内容,完成后,做其他事情
- 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);
})
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.readdir
和 fs.readFile
是异步函数。他们的操作结果只在他们的回调函数中可用。
这是您当前正在做的事情:
- 声明新的空数组
arr
- 读取目录的内容,完成后,做其他事情
- 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);
})