如何用js复制文件并用随机数重命名
How to copy a file and rename it with a random number with js
我有很多文件,我需要用随机数字重命名它们。
这是一个包含 50 个文件(1 到 50)的示例
但是有些没有被复制,因为它们是一些生成了两次的数字。
如果我一次又一次地 运行 脚本,我会得到所有新的 50 个文件,但有些是重复的。
const fs = require('fs');
for (let i = 1; i <= 50; i++) {
function getRandomNumber(min, max) {
let totalEle = max - min + 1;
let result = Math.floor(Math.random() * totalEle) + min;
return result;
}
function createArrayOfNumber(start, end) {
let myArray = [];
for (let i = start; i <= end; i++) {
myArray.push(i);
}
return myArray;
}
let numbersArray = createArrayOfNumber(1, 50);
let randomIndex = getRandomNumber(0, numbersArray.length - 1);
let randomNumber = numbersArray[randomIndex];
numbersArray.splice(randomIndex, 1);
fs.copyFile(`old/${i}.json`, `new/${randomNumber}.json`, (err) => {});
}
这是我在 js 中的第一步,我试图弄明白但我不是...我能做什么?
问题是您在循环中定义了函数和 numbersArray
,因此您在每次迭代中都这样做,因此数字会重复。 (所以就好像你没有从 numbersArray
中删除号码)
这是我会使用的解决方案:
const fs = require('fs');
const numberOfFiles = 50;
// Create an array containing numbers from 1 to the numberOfFiles defined
let availableNumbers = Array.from({ length: numberOfFiles }, (v, k) => k + 1);
for (let i = 1; i < numberOfFiles; i++) {
let randomIndex = Math.floor(Math.random() * availableNumbers.length);
let randomNumber = availableNumbers[randomIndex];
fs.copyFile(`old/${i}.json`, `new/${randomNumber}.json`, (err) => { });
availableNumbers.splice(randomIndex, 1);
}
我测试并重写了您的代码。有一些东西可以帮助它按预期运行。
我将您的函数从代码中移出,以防止在循环的每次迭代中重新定义函数。
我添加了一个数组 alreadyHit
,函数 gerRandomNumber
检查已使用的号码。如果它已经被使用过,那么我们使用一些递归逻辑来再次调用该函数。我添加了一些错误测试,以防止在没有更多数字剩余时出现无限循环。基本上,如果尝试生成随机数的次数超过 100 次,我们就会抛出错误。
有问题请追问
const fs = require("fs");
const alreadyHit = [];
function getRandomNumber(min, max, attempts = 0) {
if (attempts > 100) throw new Error("Not enough numbers probably");
let totalEle = max - min + 1;
let result = Math.floor(Math.random() * totalEle) + min;
if (alreadyHit.includes(result)) return getRandomNumber(min, max, attempts + 1);
return result;
}
function createArrayOfNumber(start, end) {
let myArray = [];
for (let i = start; i <= end; i++) {
myArray.push(i);
}
return myArray;
}
const numbersArray = createArrayOfNumber(1, 50);
for (let i = 1; i <= 50; i++) {
const randomIndex = getRandomNumber(0, numbersArray.length - 1);
const randomNumber = numbersArray[randomIndex];
alreadyHit.push(randomIndex);
fs.copyFile(`./old/${i}.json`, `./new/${randomNumber}.json`, err => {
if (err) console.log("Error Found:", err);
});
}
我需要为
添加起始索引
const fs = require("fs");
const startIndex = 1
const numberOfFiles = 5;
// Create an array containing numbers from 1 to the numberOfFiles defined
let availableNumbers = Array.from({ length: numberOfFiles }, (v, k) => k + 1);
for (let i = startIndex; i < startIndex + numberOfFiles; i++) {
let randomIndex = Math.floor(Math.random() * availableNumbers.length);
let randomNumber = availableNumbers[randomIndex];
fs.copyFile(`old/${i}.json`, `new/${randomNumber}.json`, (err) => { });
availableNumbers.splice(randomIndex, 1);
}
我有很多文件,我需要用随机数字重命名它们。
这是一个包含 50 个文件(1 到 50)的示例
但是有些没有被复制,因为它们是一些生成了两次的数字。 如果我一次又一次地 运行 脚本,我会得到所有新的 50 个文件,但有些是重复的。
const fs = require('fs');
for (let i = 1; i <= 50; i++) {
function getRandomNumber(min, max) {
let totalEle = max - min + 1;
let result = Math.floor(Math.random() * totalEle) + min;
return result;
}
function createArrayOfNumber(start, end) {
let myArray = [];
for (let i = start; i <= end; i++) {
myArray.push(i);
}
return myArray;
}
let numbersArray = createArrayOfNumber(1, 50);
let randomIndex = getRandomNumber(0, numbersArray.length - 1);
let randomNumber = numbersArray[randomIndex];
numbersArray.splice(randomIndex, 1);
fs.copyFile(`old/${i}.json`, `new/${randomNumber}.json`, (err) => {});
}
这是我在 js 中的第一步,我试图弄明白但我不是...我能做什么?
问题是您在循环中定义了函数和 numbersArray
,因此您在每次迭代中都这样做,因此数字会重复。 (所以就好像你没有从 numbersArray
中删除号码)
这是我会使用的解决方案:
const fs = require('fs');
const numberOfFiles = 50;
// Create an array containing numbers from 1 to the numberOfFiles defined
let availableNumbers = Array.from({ length: numberOfFiles }, (v, k) => k + 1);
for (let i = 1; i < numberOfFiles; i++) {
let randomIndex = Math.floor(Math.random() * availableNumbers.length);
let randomNumber = availableNumbers[randomIndex];
fs.copyFile(`old/${i}.json`, `new/${randomNumber}.json`, (err) => { });
availableNumbers.splice(randomIndex, 1);
}
我测试并重写了您的代码。有一些东西可以帮助它按预期运行。
我将您的函数从代码中移出,以防止在循环的每次迭代中重新定义函数。
我添加了一个数组 alreadyHit
,函数 gerRandomNumber
检查已使用的号码。如果它已经被使用过,那么我们使用一些递归逻辑来再次调用该函数。我添加了一些错误测试,以防止在没有更多数字剩余时出现无限循环。基本上,如果尝试生成随机数的次数超过 100 次,我们就会抛出错误。
有问题请追问
const fs = require("fs");
const alreadyHit = [];
function getRandomNumber(min, max, attempts = 0) {
if (attempts > 100) throw new Error("Not enough numbers probably");
let totalEle = max - min + 1;
let result = Math.floor(Math.random() * totalEle) + min;
if (alreadyHit.includes(result)) return getRandomNumber(min, max, attempts + 1);
return result;
}
function createArrayOfNumber(start, end) {
let myArray = [];
for (let i = start; i <= end; i++) {
myArray.push(i);
}
return myArray;
}
const numbersArray = createArrayOfNumber(1, 50);
for (let i = 1; i <= 50; i++) {
const randomIndex = getRandomNumber(0, numbersArray.length - 1);
const randomNumber = numbersArray[randomIndex];
alreadyHit.push(randomIndex);
fs.copyFile(`./old/${i}.json`, `./new/${randomNumber}.json`, err => {
if (err) console.log("Error Found:", err);
});
}
我需要为
const fs = require("fs");
const startIndex = 1
const numberOfFiles = 5;
// Create an array containing numbers from 1 to the numberOfFiles defined
let availableNumbers = Array.from({ length: numberOfFiles }, (v, k) => k + 1);
for (let i = startIndex; i < startIndex + numberOfFiles; i++) {
let randomIndex = Math.floor(Math.random() * availableNumbers.length);
let randomNumber = availableNumbers[randomIndex];
fs.copyFile(`old/${i}.json`, `new/${randomNumber}.json`, (err) => { });
availableNumbers.splice(randomIndex, 1);
}