Tengo muchos archivos y necesito cambiarles el nombre con números aleatorios.
Aquí hay un ejemplo con 50 archivos (1 a 50) Encontré este código y puedo cambiar el nombre de los archivos y colocarlos en nuevas carpetas ...
PERO algunos no se copian ya que hay algunos números que se generan dos veces. Y si ejecuto el script una y otra vez, obtengo todos mis 50 archivos nuevos, pero hay algunos que están duplicados.
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) => {}); }Son mis primeros pasos en js, trato de resolverlo y no estoy ... ¿Qué puedo hacer?
El problema es que está definiendo las funciones y la matriz de numbersArray en el bucle, por lo que lo hace para cada iteración, por lo que los números se duplican. (Así que es como si no hubieras eliminado el número de la numbersArray de números)
Aquí hay una solución que usaría:
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); }Necesitaba agregar un índice de inicio a la solución de norbot
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); }Probé y reescribí tu código. Hay algunas cosas que ayudarían a que funcione según lo previsto.
Saqué sus funciones del código para evitar redefinir la función en cada iteración del bucle.
Agregué una matriz alreadyHit que la función gerRandomNumber verifica el número que ya se ha utilizado. Si ya se usó, usamos alguna lógica recursiva para simplemente llamar a la función nuevamente. Agregué un poco de prueba de error para evitar un bucle infinito si no quedan más números. Básicamente, si hay más de 100 intentos de hacer un número aleatorio, arrojamos un error.
Por favor, pregunte si tiene alguna pregunta 👍
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); }); }