Перебор списка в JSON с использованием TypeScript - PullRequest
0 голосов
/ 05 июня 2019

У меня проблема с итерацией по моему json в TypeScript. У меня проблемы с одним конкретным полем JSON, tribe. По какой-то причине я не могу повторить это. В отладчике я ожидаю, что Orc появится, но вместо этого я получу 0. Почему это? Как правильно выполнить итерацию по моим tribe данным?

// Maps a profession or tribe group name to a bucket of characters
let professionMap = new Map<string, Character[]>()
let tribeMap = new Map<string, Character[]>()

let herolistJson = require('./data/HeroList.json')

for (let hero of herolistJson){

  // Certain characters can have more than one tribe
  // !!!!! The trouble begins here, tribe is 0???
  for (let tribe in hero.tribe){
    let tribeBucket = tribeMap.get(tribe) as Character[]

    // If the hero does not already exist in this tribe bucket, add it
    if(tribeBucket.find(x => x.name == hero.name) === undefined )
    {
      tribeBucket.push(new Character(hero.name, hero.tribe, hero.profession, hero.cost))
    }
  }
}    

Мой файл json выглядит так

[
  { 
    "name": "Axe", 
    "tribe": ["Orc"], 
    "profession": "Warrior",
    "cost": 1
  },
  {
    "name": "Enchantress",
    "tribe": ["Beast"],
    "profession": "Druid",
    "cost": 1
  }
] 

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Измените "in" на "of" во втором цикле.

1 голос
/ 05 июня 2019

in выполняет итерации по ключам объекта, а не по значениям.Ключи массива - это его индексы.Если вместо этого вы используете of, вы будете использовать более новый протокол итератора, а итератор Array предоставляет значения вместо ключей.

for (let tribe of /* in */ hero.tribe) {

Обратите внимание, чтоэто не будет работать в IE 11, но будет работать в большинстве других браузеров, а также во многих средах JS, которые совместимы с ES2015. kangax / compat имеет частичный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...