Je suis donc un débutant en js et j'ai un tableau des utilisateurs dans un fichier json et je crée une fonction de suppression de compte. J'ai mis en place une recherche pour trouver l'utilisateur et cela fonctionne bien mais je ne peux pas comprendre comment le faire supprimer l'utilisateur du fichier, toute aide serait appréciée!
Json:
function findJson() {
fs.readFile('./linkedusers.json', 'utf-8', function (err, data) {
if (err) message.channel.send('Invalid Code.')
var arrayOfObjects = JSON.parse(data)
let findEntry = arrayOfObjects.users.find(entry => entry.discordId == myCode)
let linkEmbed = new Discord.RichEmbed()
.setTitle('Account unlinked!')
.setDescription('Link your account by friending "BattleDash Bot" on Fortnite and then input the code you get messaged by typing "!link <code>"!')
.setColor('#a900ff');
message.channel.send({embed: linkEmbed});
})
}
JS:
{
"users": [
{
"name": "ImBattleDash",
"Id": "780748c5d4504446bbba3114ce48f6e9",
"discordId": "471621420162744342",
"dateAdded": 1548295371
}
]
}
EDIT: Je ne sais pas si c'est un tableau ou une table que je ne connais pas beaucoup sur json
3 Réponses :
Vous devez utiliser:
Array # find pour trouver un utilisateur donné selon certains critères donnés. Array # indexOf pour obtenir l'index de l'utilisateur trouvé dans users Array # splice pour supprimer un élément à partir de l'index donné par Array # indexOf :
const input = {
"users": [
{
"name": "ImBattleDash",
"Id": "780748c5d4504446bbba3114ce48f6e9",
"discordId": "471621420162744342",
"dateAdded": 1548295371
}
]
}
const removeUser = (criteria, users) =>
users.splice (users.indexOf (users.find (criteria)), 1)
removeUser (
({ Id, discordId }) =>
Id == '780748c5d4504446bbba3114ce48f6e9'
&& discordId == '471621420162744342',
input.users
)
// Output: 0 <-- User has been removed!
console.log(input.users.length)
Concernant la persistance du changement, il s'agit simplement d'appeler JSON.stringify (input) et d'écrire simplement le contenu dans le fichier de sortie souhaité. Consultez ces autres questions / réponses: Écriture de fichiers dans Node.js
p >
pour l'entrée const que dois-je mettre puisque le tableau est dans un fichier json pas dans le fichier js? Pardon
@BattleDash Mais, voulez-vous supprimer physiquement les utilisateurs du fichier JSON? Je veux dire, tu veux écrire tout le fichier?
Oui, j'ai essentiellement deux fichiers, users.json et linkedusers.json, users.json est destiné aux utilisateurs non vérifiés (non liés) et linkedusers.json a des identifiants d'utilisateurs qui sont liés à leurs identifiants Discord. Je fais la commande de dissociation qui les supprimerait complètement de linkedusers.json
@BattleDash Une fois que vous avez supprimé l'utilisateur, il vous suffit de conserver le fichier en utilisant fs.writeFile dans Node.
Ouais Dans la commande de lien, je fais cela avec fs.writeFile ('./ linkedusers.json', JSON.stringify (arrayOfObjects, null, 4) .
@BattleDash J'ai mis à jour ma réponse avec cette solution. C'est juste ça :)
Merci! Exactement ce dont j'avais besoin!
@BattleDash Vous êtes les bienvenus! Quelqu'un a commenté votre question et a indiqué que vous pouviez utiliser Array # filter . Cela peut dépendre de vos besoins: si vous devez muter input.users , notre conclusion est bonne, sinon l'autre approche pourrait être intéressante: D
Voici un tutoriel rapide pour vous:
"Users" serait soit un tableau (en utilisant [] ) soit un objet javascript (en utilisant {} ), votre choix. Il n'y aura pas de tables réelles à moins d'utiliser une base de données au lieu d'un fichier JSON (bien que si votre expression JSON est aussi simple que votre exemple, vous pourriez presque la considérer comme une table.) - Et en fait, une troisième option serait d'utiliser le type de carte javascript, qui est comme un objet renforcé, mais je ne vais pas aborder cela ici.
L'utilisation d'un tableau faciliterait un peu la récupération d'une liste de données pour tous les utilisateurs (car les tableaux sont plus simples à parcourir), l'utilisation d'un objet faciliterait considérablement la récupération des données pour un utilisateur unique (puisque vous pouvez spécifier directement l'utilisateur de votre choix par son key au lieu d'avoir besoin de parcourir tout le tableau jusqu'à ce que vous trouviez celui que vous voulez.) Je vais vous montrer un exemple qui utilise un objet.
L'utilisateur individuel dans votre exemple de code est un exemple d'un objet javascript. JSON vous permet de convertir un objet en chaîne (pour le stockage, les E / S et la lisibilité humaine) et de le renvoyer en objet (afin que javascript puisse le comprendre). Vous utilisez les méthodes JSON.stringify () et JSON.parse (), respectivement pour ces conversions. La chaîne doit être au format JSON, sinon cela ne fonctionnera pas, et votre exemple est presque au format JSON.
Pour respecter le format JSON, vous pouvez structurer un objet Users comme suit. (Bien sûr, nous examinons la version stringifiée car de simples humains ne peuvent pas facilement lire un objet javascript "réel"):
JSON.stringify(usersObject);
Une fois que vous avez récupéré la chaîne du stockage, vous le convertissez en objet et supprimez un utilisateur comme suit. (Ceci est divisé en plus d'étapes que nécessaire pour plus de clarté.):
let discordId = userToModifyOrDelete.discordId; // Not necessary, just shows how to retrieve value let newDiscordId = "whateverId"; userToModifyOrDelete.discordId = newDiscordId;
Pour modifier le discordId de l'utilisateur à la place, vous devez faire:
let usersObject = JSON.parse(stringRetrievedFromFile); let userId = "780748c5d4504446bbba3114ce48f6e9"; let userToModifyOrDelete = usersObject[userId]; delete userToModifyOrDelete;
Avec l'aide précieuse de Cat et Matias, j'ai trouvé ce code qui fonctionne!
function findJson() {
fs.readFile('./linkedusers.json', 'utf-8', function (err, data) {
if (err) message.channel.send('Invalid Code.')
var arrayOfObjects = JSON.parse(data)
let findEntry = arrayOfObjects.users.find(entry => entry.discordId == myCode)
const input = arrayOfObjects;
const removeUser = (criteria, users) =>
users.splice (users.indexOf (users.find (criteria)), 1)
removeUser (
({ Id, discordId }) =>
Id == findEntry.Id
&& discordId == findEntry.discordId,
input.users
)
console.log('unlinked')
fs.writeFile('./linkedusers.json', JSON.stringify(arrayOfObjects, null, 4), 'utf-8', function(err) {
if (err) throw err
console.log('Done!')
})
let linkEmbed = new Discord.RichEmbed()
.setTitle('Account unlinked!')
.setDescription('Link your account by friending "BattleDash Bot" on Fortnite and then input the code you get messaged by typing "!link <code>"!')
.setColor('#a900ff');
message.channel.send({embed: linkEmbed});
})
}
Vous pouvez simplement utiliser le
filtre. Il utilise la logique inverse / prédicat commefindet aboutirait à un tableau qui ne contient pas l'utilisateur spécifié. La façon dont vous persistez les modifications apportées au fichier est un problème / une question différent.