TypeScript, цикл по словарю

64

В моем коде у меня есть несколько словарей (как предложено здесь), которые индексируются String. Из-за того, что это немного импровизированный тип, мне было интересно, есть ли какие-либо предложения о том, как я мог бы прокручивать каждую клавишу (или значение, все, что мне нужно для ключей в любом случае). Любая помощь ценится!

myDictionary: { [index: string]: any; } = {};
  • 0
    Вы пробовали: for (var key in myDictionary) { } ? Внутри цикла вы использовали бы key чтобы получить ключ, и myDictionary[key] чтобы получить значение
  • 0
    @Ian Только что попробовал, похоже, не работает. Нет ошибок, но ничего не работает в заявлении
Показать ещё 1 комментарий

5 ответов

101
Лучший ответ

Чтобы перебрать ключ/значения, используйте цикл for in:

for (let key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}
  • 0
    Нужно ли использовать «ключ» в качестве имени переменной?
  • 2
    @Yiping Нет, но это помогает прояснить для меня
Показать ещё 5 комментариев
31

Существует одна оговорка к циклу ключа/значения, о котором упоминал Ян. Если возможно, что объекты могут иметь атрибуты, прикрепленные к их прототипу, а когда вы используете оператор in, эти атрибуты будут включены. Поэтому вам нужно убедиться, что ключ является атрибутом вашего экземпляра, а не прототипом. Старые IE известны тем, что indexof(v) отображается как ключ.

for (var key in myDictionary) {
    if (myDictionary.hasOwnProperty(key)) {
        var value = myDictionary[key];
    }
}
  • 2
    Не пытаясь разбить волосы, но так как мы говорим о типе script, разве вы не должны использовать let key вместо var key? Хороший ответ, спасибо.
  • 3
    Фактически, в текущей версии скрипта типа key и value могут быть const .
28

@Alcesem имел это почти право, за исключением того, что преимущество этого метода состоит в том, что не нужно включать hasOwnProperty() guard с Object.keys, потому что итератор не будет искать дальше цепочку прототипов. Следовательно, следующие словари не только безопасны для словарей, но и для любого типа объектов как в Typescript, так и в Javascript.

< ES 2017:

Object.keys(obj).forEach(key => {
  let value = obj[key];
});

>= ES 2017:

Object.entries(obj).forEach(
  ([key, value]) => console.log(key, value)
);
  • 0
    Это решение, которое я искал, так как оно позволит мне отсортировать ключи перед итерацией
  • 0
    К вашему сведению, в настоящее время это не поддерживается игровой площадкой TypeScript.
Показать ещё 1 комментарий
5

Как насчет этого?

for (let [key, value] of Object.entries(obj)) {
    ...
}
2

Я также поднимусь, чтобы один способ захватить значение, присвоенное переменной "ключ":

Object.keys(myDictionary).forEach(key => {
    if (myDictionary.hasOwnProperty(key)) {    
        var value = myDictionary[key];
    }
});

Ещё вопросы

Сообщество Overcoder
Наверх
Меню