Почему сравнение свойства с author.id не работать?

#javascript #node.js #discord #discord.js

#javascript #node.js #Discord #discord.js

Вопрос:

Итак, вот мой текущий код для валютной системы. Этот код работает для добавления новой информации о пользователе. Очевидно, что это будет продолжать добавлять людей, которые уже есть в нем.

 if (!currency[message.author.id]) {
            currency.push({id: message.author.id, coins: 0});
        }
 

если я изменю его на этот, ничего не произойдет. Кажется, что-то не так с этим сравнением, и я не уверен, что это такое, учитывая, что это сработало для других вещей, которые я использовал.

 if (!currency[0].id == message.author.id) {
            currency.push({id: message.author.id, coins: 0});
        }
 

Это выглядит правильно для меня, поскольку он получает свойство id первого элемента и проверяет, совпадают ли они. Когда я запускаю код, он просто ничего не делает. Никаких ошибок и ничего в файле json, который я использую для его хранения. Он делает это, когда массив пуст, и делает это, когда у меня там есть свойство id.

Разве это невозможно? Мне не нравится настраивать его с помощью первого способа, потому что я хотел бы иметь доступ к валюте каждого пользователя, если это необходимо для добавления или удаления, без необходимости делать это по одному человеку за раз.

Ответ №1:

Я думаю, что это должно быть !== :

 if (currency[0].id !== message.author.id) {
            currency.push({id: message.author.id, coins: 0});
}
 

или должно быть заключено в скобки:

 if (!(currency[0].id == message.author.id)) {
            currency.push({id: message.author.id, coins: 0});
}
 

Комментарии:

1. Я завернул его, и он отлично работает. Большое вам спасибо, я не знаю, почему я этого не понял.

Ответ №2:

Похоже, вам, вероятно, нужна структура данных, представляющая собой объект, а не массив, чтобы вы могли иметь произвольные пары ключ-значение — пусть ключ будет message.author.id .

 const currency = {};
// ...

const { id } = message.author;
if (!currency[id]) {
  currency[id] = { id, coins: 0 };
} else {
  // this author was already inserted - do something else here, if desired
  // current[id].coins  = coinChangeAmount;  // for example
}
 

Ваш исходный код звучит так, как будто он неправильно использует массив как объект, и currency[0].id == message.author.id будет проверять только [0] й элемент массива, а не перебирать все возможные элементы и искать совпадение идентификаторов.

Комментарии:

1. Видите ли, у меня есть эта настройка для моей системы прокачки, а также для другого события, которое я собирался, но мне не нравится, что я не могу дать всем монеты с 1 командой, если это необходимо. Все это будет проходить по идентификатору автора, и я не знаю способа перебрать все, как я мог бы сделать с циклом for

2. Было бы очень легко раздать всем монеты с каким-нибудь предметом. for (const obj of Object.values(currency)) obj.coins , например