Итак, я новичок в js, и у меня есть таблица пользователей в файле json, и я делаю функцию удаления учетной записи. У меня настроен поиск пользователя, и он работает нормально, но я не могу понять, как заставить его удалить пользователя из файла, буду признателен за любую помощь!
Json:
{
"users": [
{
"name": "ImBattleDash",
"Id": "780748c5d4504446bbba3114ce48f6e9",
"discordId": "471621420162744342",
"dateAdded": 1548295371
}
]
}
JS:
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});
})
}
Обновлено: не уверен, что это массив или таблица, я мало знаю о json



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вам нужно использовать:
Array#find для поиска заданного пользователя по заданным критериям.Array#indexOf для получения индекса найденного пользователя в usersArray#splice, чтобы удалить один элемент, начиная с индекса, заданного 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.info(input.users.length)Насчет сохранения изменения, это просто вызов JSON.stringify (input) и потом просто записать содержимое в нужный выходной файл. См. другие вопросы и ответы: Запись файлов в Node.js
для константного ввода, что мне поставить, так как массив находится в файле json, а не в файле js? Прости
@BattleDash Но хотите ли вы физически удалить пользователей из файла JSON? Я имею в виду, вы хотите записать весь файл?
Да, у меня в основном есть два файла: users.json и linkedusers.json, users.json предназначен для непроверенных пользователей (не связанных), а linkedusers.json имеет идентификаторы пользователей, которые связаны с их идентификаторами Discord. Я делаю команду unlink, которая полностью удалит их из linkedusers.json.
@BattleDash После того, как вы удалили пользователя, вам просто нужно сохранить файл с помощью fs.writeFile в Node.
Да, в команде ссылки я делаю это с fs.writeFile('./linkedusers.json', JSON.stringify(arrayOfObjects, null, 4).
@BattleDash Я обновил свой ответ этим решением. Это просто :)
Спасибо! Именно то, что мне было нужно!
@BattleDash Добро пожаловать! Кто-то прокомментировал ваш вопрос и указал, что вы можете использовать Array#filter. Это может зависеть от ваших потребностей: если вам нужно мутировать input.users, наш вывод в порядке, в противном случае может быть интересен другой подход :D
Вот краткое руководство для вас:
«Пользователи» будут либо массивом (с использованием []), либо объектом javascript (с использованием {}), на ваш выбор. Никаких реальных таблиц не будет, если вы не используете базу данных вместо файла JSON (хотя, если ваше выражение JSON такое же простое, как ваш пример, вы могли бы думать о нем почти как о таблице). - И на самом деле, третий вариант будет использовать тип карты javascript, который похож на усиленный объект, но я не буду здесь говорить об этом.
В то время как использование массива немного упростило бы получение списка данных для пользователей все (поскольку массивы проще перебирать), использование объекта значительно облегчило бы получение данных для пользователя не замужем (поскольку вы можете напрямую указать пользователя, которого вы хотите, по его ключу, вместо того, чтобы перебирать весь массив, пока не найдете нужного.) Я покажу вам пример, в котором используется объект.
Отдельный пользователь в вашем образце кода является примером объекта javascript. JSON позволяет преобразовать объект в строку (для хранения, ввода-вывода и удобочитаемости) и обратно в объект (чтобы javascript мог его понять). Вы используете методы JSON.stringify() и JSON.parse() соответственно для этих преобразований. Строка должна быть в формате JSON, иначе это не сработает, и ваш пример — почти в формате JSON.
Чтобы соответствовать форматированию JSON, вы можете структурировать объект Users следующим образом. (Конечно, мы смотрим на строковую версию, потому что простые люди не могут легко прочитать «настоящий» объект javascript):
"Users": { // Each individual user is a property of your users object
"780748c5d4504446bbba3114ce48f6e9": // The Id is the key in the "key/value pair"
{ // The individual user object itself is the value in the key/value pair
// Id is duplicated inside user for convenience (not necessarily the best way to do it)
"id": "780748c5d4504446bbba3114ce48f6e9",
"name": "ImBattleDash", // Each property of the user is also a key/value pair
"discordId": "471621420162744342", //Commas separate the properties of an object
"dateAdded": "1548295371" // All property values need double quotes for JSON compatibility
}, // Commas separate the properties (ie the individual users) of the users object
"446bbba3114ce48f6e9780748c5d4504": // This string is the second user's key
{ // This object is the second user's value
"id": "446bbba3114ce48f6e9780748c5d4504",
"name": "Wigwam",
"discordId": "162744342471621420",
"dateAdded": "1548295999"
}
}
Как только вы извлекаете строку из хранилища, вы конвертируете ее в объект и удаляете пользователя следующим образом. (Это разбито на большее количество шагов, чем необходимо для ясности.):
let usersObject = JSON.parse(stringRetrievedFromFile);
let userId = "780748c5d4504446bbba3114ce48f6e9";
let userToModifyOrDelete = usersObject[userId];
delete userToModifyOrDelete;
Чтобы вместо этого изменить discordId пользователя, вы должны сделать:
let discordId = userToModifyOrDelete.discordId; // Not necessary, just shows how to retrieve value
let newDiscordId = "whateverId";
userToModifyOrDelete.discordId = newDiscordId;
И вы должны преобразовать объект обратно в строку для сохранения в файле с помощью:
JSON.stringify(usersObject);
Надеюсь, это почти все, что вам нужно знать о 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)
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.info('unlinked')
fs.writeFile('./linkedusers.json', JSON.stringify(arrayOfObjects, null, 4), 'utf-8', function(err) {
if (err) throw err
console.info('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});
})
}
Вы можете просто использовать
filter. Он использует обратную логику/предикат какfindи приведет к массиву, который не содержит указанного пользователя. Как вы сохраняете изменения в файле, это другая проблема/вопрос.