如何用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);
}