我正在尝试从给定目录中选择一些随机文件。以下是我目前的实现;但是,文件夹中的文件太多,将它们全部迭代,然后随机选择几个文件似乎有些过分。
有更好的解决方案吗?因为我想知道文件夹里面的所有文件是随机选择的前提吗?
const dirs = fs.readdirSync(IMAGE_BANK_SRC)
.map(file => {
return path.join(IMAGE_BANK_SRC, file);
});
const srcs_dup = [];
dirs.forEach(path => {
fs.readdirSync(path).forEach(file => {
srcs_dup.push(file);
});
});
// Pick few random ones from `srcs_dup`
要求:
- 选择的随机文件应该是唯一的
- 如果文件夹包含的文件少于预期,代码仍然有效
- 尽快
最佳答案
嗯,readDir
& readDirSync
返回一个数组。您可以使用 length 属性避免映射整个路径数组。我们可以使用长度的百分比来创建一个动态样本集,然后将样本存储在一个新数组中。
const dirs = fs.readdirSync(IMAGE_BANK_SRC);
const length = dirs.length;
const sampleSet = 25/100 * length;
const getRandomIndex = length => Math.floor( Math.random() * length );
let samples = [];
let usedIndices = [];
let randomIndex = undefined;
for (let i = 0; i < sampleSet; i++){
do {
randomIndex = getRandomIndex( length );
}
while ( usedIndices.includes( randomIndex ) );
usedIndicies.push( randomIndex );
samples.push( dirs[randomIndex] );
}
关于javascript - 如何使用 Node.js 从给定路径中选择多个随机文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42217181/