Если операторы не работают с массивом JSON - PullRequest
0 голосов
/ 10 февраля 2019

У меня есть JSON-файл с двумя раздельными идентификаторами клиентов `{

{
       "premium": [
         "a random string of numbers that is a client id",
         "a random string of numbers that is a client id"
         ]
}

Я пытался получить доступ к этим идентификаторам клиентов, чтобы выполнить какие-либо действия в программе, используя цикл for + if:

for(i in premium.premium){
      if(premium.premium[i] === msg.author.id){
        //do some stuff
      }else{
       //do some stuff

Когда программа запускается, она запускает цикл for, сначала переходит к другому и запускает там код (не должно происходить), а затем запускает код в if дважды.Но есть только 2 идентификатора клиента, и цикл for выполнялся 3 раза, и при первом запуске он мгновенно переходит к другому, даже если тот, кто отправил сообщение, имеет свой идентификатор клиента в файле JSON.

Как я могу это исправить?Любая помощь с благодарностью.

Ответы [ 3 ]

0 голосов
/ 10 февраля 2019
for(i in premium.premium){
   if(premium.premium[i] === msg.author.id){
      //do some stuff
   } else{
       //do some stuff
   }
}

1) Он будет перебирать все ваши записи premium.premium.Если есть 3 записи, он будет выполнен три раза.Вы можете использовать оператор break, если хотите выйти из цикла, как только найдено совпадение.

2) Вам следует проверить тип вашего msg.author.id.Поскольку вы используете оператор строгого сравнения ===, он оценивается как false , если ваш msg.author.id является целым числом, поскольку вы сравниваете со строкой (на основе предоставленного вами json).

Использовать неявное приведение: if (premium.premium[i] == msg.author.id)
Использовать явное приведение: if (premium.premium[i] === String(msg.author.id))

0 голосов
/ 10 февраля 2019

Действительно забавный и простой способ решения подобных проблем - использовать встроенные методы Array, такие как map, Reduce или Filter.Тогда вам не нужно беспокоиться о значениях вашего итератора.

например.

const doSomethingAuthorRelated = (el) => console.log(el, 'whoohoo!');

const authors = premiums
                 .filter((el) => el === msg.author.id)
                 .map(doSomethingAuthorRelated);

Как отмечает Джон Лоновски в ссылке на комментарий, использование массивов for ... in для JavaScript ненадежно, поскольку оно предназначено для итерации по свойствам объекта, поэтому вы не можете быть уверены, что именноитерация продолжается, если вы четко не определили данные и не работаете в среде, в которой вы не знаете, что ни одна другая библиотека не попала в объект Array.

0 голосов
/ 10 февраля 2019

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

Например, здесь нет операторов return:

const json = {
  "premium": [
    "aaa-1",
    "bbb-1"
  ]
}

for (i in json.premium) {
  if (json.premium[i] === "aaa-1") {
    console.log("this is aaa-1!!!!")
  } else {
    console.log("this is not what you're looking for-1...")
  }
}

И вот с return заявлениями:

const json = {
  "premium": [
    "aaa-2",
    "bbb-2"
  ]
}

function loopOverJson() {
for (i in json.premium) {
  if (json.premium[i] === "aaa-2") {
    console.log("this is aaa-2!!!!")
    return
  } else {
    console.log("this is not what you're looking for-2...")
    return
  }
}
}

loopOverJson()

Примечание: без включения вышеуказанного в функцию консоль отобразит: «Ошибка синтаксиса: оператор недопустимого возврата».

...