Как я могу l oop через массив - PullRequest
2 голосов
/ 15 апреля 2020

У меня проблемы с зацикливанием массива. Я делаю RPG-бот для Discord, и мне нужно отобразить inventory игрока, когда будет предложено. Я пытался использовать Object.values(), Object.map() и Object.entries(). Имена items уже разработаны с Object.keys(inventory), но проблема values.

var invItems = Object.keys(inventory);
var InvValues = Object.entries(inventory);
for (var i = 0; i <= invItems.length; i += 1) {
       if (invValues[i[1]] > 0) {
           message.channel.send(`${invValues[i[1]]}x ${invItems[i]}`);
       }
};

Я начинающий кодер, поэтому, пожалуйста, объясните более подробно, чем вы обычно можете пожалуйста.

Ответы [ 3 ]

2 голосов
/ 15 апреля 2020

Вы можете отправлять значения в message.channel напрямую, используя for...of l oop как:

for (let [key, value] of Object.entries(inventory)) {
  if (value > 0) {
    message.channel.send(`${value}x ${key}`);
  }
}

Объяснение:

Метод Object.entries() возвращает массив пар собственных перечислимых строковых ключей заданного объекта [ключ, значение]. Итак, когда мы используем его как:

const object1 = {
  a: 'somestring',
  b: 42
};

console.log(Object.entries(object1));

Вы можете получить обратно массив, и каждый внутренний массив - это другой массив пары ключ-значение. Теперь мы можем получить каждый ключ и значение, используя деструктуризацию массива и for...of l oop, например:

const object1 = {
  a: 'somestring',
  b: 42
};

for (let [key, value] of Object.entries(object1)) {
  console.log(`${key}: ${value}`);
}

// Returns:
// "a: somestring"
// "b: 42"

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

1 голос
/ 15 апреля 2020
var invItems = Object.keys(inventory);
var invValues = Object.entries(inventory); // fixed the capital i

for (var i = 0; i <= invItems.length; i += 1) {

   if (invValues[i] > 0) {
       message.channel.send(`${invValues[i]}x ${invItems[i]}`);
   }
};

Вы не используете i в качестве индекса, скорее вы пытаетесь получить доступ к i[1], как если бы это был массив

, также в Javascript вы также можете сделать JSON.stringify чтобы увидеть структуру объекта. это напечатает ваш inventory на JSON String.

//this may help you see what the inventory looks like
for(let i = 0; i<inventory.length; i+=1)
console.log(JSON.stringify(inventory[i]));

0 голосов
/ 15 апреля 2020

Вы находитесь на правильном пути с Object.entries, который предоставит массив парных пар ключ / значение. Обратите внимание, что здесь: invValues[i[1]] вы пытаетесь получить доступ к свойству 1 из i с возможно undefined. Вы можете избежать некоторых сложностей, если итерируете с forEach здесь.

const inventory = {
  itemA: 'description for A',
  itemB: 'description for B'
}

Object.entries(inventory).forEach(([key, value]) => {
  // replace with message.channel.send(...)
  console.log(`${key}: ${value}`)
})
...