Как правильно перебрать объект в TypeScript - PullRequest
0 голосов
/ 12 апреля 2020

Я пытаюсь найти правильный путь для l oop через объект при использовании TypeScript. Следующие примеры будут действительны JavaScript, но я понимаю, почему это становится проблемой в TypeScript, однако я не нахожу правильный путь для выполнения этой задачи, и мне было интересно, если я думаю об этом неправильно.

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

Пример:

interface A {
  abc: number
  acd: number
}
interface B {
  bcd: number
  bde: number
}
interface C {
  cde: number
  cef: number
}
interface Data {
  a: A
  b: B
  c: C
}

const data: Data = {
  a: {
    abc: 1,
    acd: 2
  },
  b: {
    bcd: 3,
    bde: 4
  },
  c: {
    cde: 5,
    cef: 6
  }
}

// Trying with for-in
for (const cat in data) {
  for (const item in cat) {
    console.log(cat, item) // works just fine cause both are strings
    console.log(data[cat][item]) // both cat and items are strings and not keys of Data.
  }
}

// Trying with for-of
for (const cat of Object.keys(data)) {
  for (const item of Object.keys(cat)) {
    console.log(data[cat][item]) // Same, cat becomes just a string and not valid key of Data.
  }
}

// Trying with forEach
Object.keys(data).forEach((cat) => {
  Object.keys(cat).forEach(item => console.log(data[cat][item])) // same thing, cat is just a string and not exactly a key of Data
})

Спасибо всем:)

Ответы [ 3 ]

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

Когда вы выполняете итерацию по Object.keys(someObject) - вы получаете ключи, а не объекты.

for (let catKey of Object.keys(data)) {
  for (let itemKey of Object.keys(data[catKey])) {
    console.log(catKey, itemKey)
    console.log(data[catKey][itemKey])
  }
}
1 голос
/ 12 апреля 2020

Я не хочу использовать "any", но в этом фрагменте кода я думаю, что довольно безопасно использовать duo для if if statments


Object.keys(data).forEach((key1 ) => {
    if(key1 in data) {
        Object.keys((data as any)[key1]).forEach((key2) => {
            if(key2 in (data as any)[key1]) {
                console.log((data as any)[key1][key2])
            }

        })
    }  
})

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

См. Это:

for (let key of Object.keys(data.a)) {
   console.log(data.a[key]);

Это приведет к выходу из системы всех ключей data.a. Вы можете сделать что-нибудь для каждой клавиши, выполнив l oop через клавиши и получив доступ к этим значениям клавиши с помощью data.a[key].

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