No puedo encontrar una manera de eliminar toda la línea de datos JSON (línea) después de su uso. Por alguna razón, delete no funciona o, más bien, dice que no está haciendo nada.
.JSON
[ {"id":"1","code":"super-S","expires_in":"","gives_currencies":"1.5","gives_items":"","number_of_attempts":"1","attempts_used":""}, {"id":"2","code":"wow!","expires_in":"","gives_currencies":"3","gives_items":"","number_of_attempts":"1","attempts_used":""}, {"id":"3","code":"slashme","expires_in":"","gives_currencies":"4","gives_items":"","number_of_attempts":"1","attempts_used":""}, {"id":"4","code":"randombla","expires_in":"","gives_currencies":"5","gives_items":"","number_of_attempts":"1","attempts_used":""} ]código
//fs configuration const fs = require('fs'); let rawdata = fs.readFileSync('test.json'); let mycodes = JSON.parse(rawdata); //something above const randomcode = mycodes[Math.floor(Math.random() * mycodes.length)]; console.log('Your code is:', randomcode['code']); //logs me a random code value delete mycodes[randomcode]; El objetivo aquí es seleccionar un código aleatorio, que está hecho, pero luego necesito eliminarlo del archivo .JSON para que no se repita. Probé varias cosas pero no funciona, delete.randomcode , etc., la línea nunca se eliminó del archivo .JSON.
Utilice Array.prototype. splice (index, deleteCount) en lugar de delete .
delete , en un Array, simplemente null la clave, sin eliminarla.
Guarde sus datos modificados usando JSON.stringify(mycodes) en ese mismo archivo.
const fs = require('fs'); const mycodes = JSON.parse(fs.readFileSync('./test.json')); const randomIndex = Math.floor(Math.random() * mycodes.length); const randomObject = mycodes[randomIndex]; console.log('Your code is:', randomObject.code); // Log a random code value mycodes.splice(randomIndex, 1); // Remove one key at randomIndex // Write back to file fs.writeFileSync('test.json', JSON.stringify(mycodes, 0, 4), 'utf8');Si ya tiene ese objeto fuera de su matriz, y dado que los objetos se pasan por referencia (como un puntero en la memoria), utilice Array.prototype.indexOf(someObject) como:
const fs = require('fs'); const mycodes = JSON.parse(fs.readFileSync('./test.json')); const randomIndex = Math.floor(Math.random() * mycodes.length); const randomObject = mycodes[randomIndex]; // later in your code.... const objIndex = mycodes.indexOf(randomObject); // Get Object index in Array mycodes.splice(objIndex, 1); // Remove it from array at that index // Write back to file fs.writeFileSync('test.json', JSON.stringify(mycodes, 0, 4), 'utf8');Debe conservar sus datos escribiéndolos nuevamente en su archivo JSON después de usar JSON.stringify() .
Mientras lo hace, puede mover su código a funciones, lo que hará que sea más fácil de leer y trabajar con él.
También es posible que desee leer acerca de la edición de matrices mediante Array.prototype.splice() .
El
deletede eliminación es para eliminar propiedades de los objetos. Si bien puede usarlo para eliminar elementos de una matriz, dejará el índice vacío en lugar de cerrar el espacio en la matriz después de la eliminación.
const fs = require('fs'); // get a random element from any array function getRandomElement (array) { const randomElement = array[Math.floor(Math.random() * array.length)]; return randomElement; } function deleteElementFromArray (array, element) { const index = array.indexOf(element); if (index < 0) return false; array.splice(index, 1); return true; } // move the reading work inside a function function readJson (filePath) { const json = fs.readFileSync(filePath, {encoding: 'utf8'}); const data = JSON.parse(json); return data; } // move the reading work inside a function function writeJson (filePath, data) { const json = JSON.stringify(data); fs.writeFileSync(filePath, json); } const jsonFilePath = 'test.json'; const mycodes = readJson(jsonFilePath); const randomcode = getRandomElement(mycodes); console.log('Your code is:', randomcode['code']); deleteElementFromArray(mycodes, randomcode); writeJson(jsonFilePath, mycodes);