Удалить пользователя из таблицы json в js

Итак, я новичок в 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

Вы можете просто использовать filter. Он использует обратную логику/предикат как find и приведет к массиву, который не содержит указанного пользователя. Как вы сохраняете изменения в файле, это другая проблема/вопрос.

sellmeadog 24.01.2019 18:57
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
331
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вам нужно использовать:

  • Array#find для поиска заданного пользователя по заданным критериям.
  • Array#indexOf для получения индекса найденного пользователя в users
  • Array#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? Прости

user10534576 24.01.2019 18:55

@BattleDash Но хотите ли вы физически удалить пользователей из файла JSON? Я имею в виду, вы хотите записать весь файл?

Matías Fidemraizer 24.01.2019 18:56

Да, у меня в основном есть два файла: users.json и linkedusers.json, users.json предназначен для непроверенных пользователей (не связанных), а linkedusers.json имеет идентификаторы пользователей, которые связаны с их идентификаторами Discord. Я делаю команду unlink, которая полностью удалит их из linkedusers.json.

user10534576 24.01.2019 18:58

@BattleDash После того, как вы удалили пользователя, вам просто нужно сохранить файл с помощью fs.writeFile в Node.

Matías Fidemraizer 24.01.2019 18:59

Да, в команде ссылки я делаю это с fs.writeFile('./linkedusers.json', JSON.stringify(arrayOfObjects, null, 4).

user10534576 24.01.2019 19:00

@BattleDash Я обновил свой ответ этим решением. Это просто :)

Matías Fidemraizer 24.01.2019 19:01

Спасибо! Именно то, что мне было нужно!

user10534576 24.01.2019 19:04

@BattleDash Добро пожаловать! Кто-то прокомментировал ваш вопрос и указал, что вы можете использовать Array#filter. Это может зависеть от ваших потребностей: если вам нужно мутировать input.users, наш вывод в порядке, в противном случае может быть интересен другой подход :D

Matías Fidemraizer 24.01.2019 19:08

Вот краткое руководство для вас: «Пользователи» будут либо массивом (с использованием []), либо объектом 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});

    })
}

Другие вопросы по теме