TypeScript, 사전을 통한 반복


184

내 코드 에는 String 인덱싱 된 몇 가지 사전이 있습니다 ( here 제안 ). 이것은 약간의 즉흥적 인 유형이기 때문에 각 키 (또는 값, 어쨌든 키가 필요한 모든 것)를 반복하는 방법에 대한 제안이 있는지 궁금합니다. 어떤 도움을 주셔서 감사합니다!

myDictionary: { [index: string]: any; } = {};

당신은 시도 했습니까 for (var key in myDictionary) { }? 루프 안에서 keymyDictionary[key]를 얻고 값을 얻는 데 사용합니다
Ian

@Ian 방금 시도했지만 작동하지 않는 것 같습니다. 오류는 없지만 명세서 내에서 아무것도 실행되지 않습니다
ben657

1
@Ian Ah 죄송합니다. 다른 코드가 엉망이었습니다. 완벽하게 작동합니다! 답변을 선택하여 선택할 수 있습니까?
ben657

답변:


294

키 / 값을 반복하려면 루프를 사용하십시오 for in.

for (let key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}

8
이것은 일반적으로 안전하지 않습니다. hasOwnProperty 테스트 (Jamie Stark의 답변에서와 같이) 또는 다른 것이 필요합니다.
Don Hatch

20
@DonHatch 실제로는 매우 안전합니다. 프로토 타입을 잘못 수정하거나 의도적으로 프로토 타입을 잘못 수정하는 라이브러리를 포함하는 경우와 같이 매우 특정한 경우에는 안전하지 않습니다. 가장 불필요한 검사로 코드를 부풀 릴지 여부는 개발자에게 달려 있습니다.
Ian

1
@Ian-내 생각은 코드가 유틸리티 함수에 길을 찾은 다음 누군가가 그 함수를 단순히 객체이지만 오히려 추가 속성이있는 것입니다. 예, 당신이 말했듯이, 그러한 시나리오의 가능성과 심각성을 평가하는 것은 개발자의 책임입니다. 나 자신에게는 정신적으로 가장 부담이 적은 접근법은 그러한 시나리오가 모든 경우에 발생하는 것처럼 보장되는 것처럼 행동하는 것입니다.
돈 해치

5
@Ian 문제는 객체 프로토 타입을 수정하는 라이브러리가 너무 많다는 것입니다. 와 같은 훨씬 더 간단한 대안이 존재할 때 이러한 유형의 패턴을 옹호하는 것은 좋지 않은 생각 Object.keys(target).forEach(key => { let value = target(key); /* Use key, value here */ });입니다. 이 방법을 보여 주어야한다면, 아직 잘 모르는 사람들을위한 위험과 더 나은 대안을 언급하십시오.
Yona Appletree

8
우리는 이미 es6과 TypeScript를 가지고 있습니다. hasOwnProperty 작성 문제가 항상 해결되지 않은 이유는 무엇입니까? 2017 년에도 JS에 모든주의를 기울였습니다. 나는 너무 실망했다.
Gherman

169

<ES 2017 :

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

> = ES 2017 :

Object.entries(obj).forEach(
  ([key, value]) => console.log(key, value);
);

이것이 반복 전에 키를 정렬 할 수있게 해주는 솔루션입니다.
Andrew

참고로, 현재로서는 TypeScript 놀이터에서 지원되지 않습니다.
Seanny123

1
참조 여기 만드는 방법을 Object.entries타이프에서 일하기
알렉스 클라우스에게

이것은 완벽하다
Piyush Choudhary

67

이건 어때요?

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

1
tsconfig에 lib es2017이 필요합니다. 참조 stackoverflow.com/questions/45422573/...
스테판

이것은 obj 유형을 {[key : string] : string}으로 명시 적으로 설정하고 {[key : 문자열] : 모든} 이것으로 '값'에 액세스 할 수 있습니다. 감사
ggedde

그리고 무시하고 싶다면 key그냥 비워 두십시오 [ , value]. ( 이 문제에 감사드립니다 .)
Dominik

50

Ian이 언급 한 키 / 값 루프에는 한 가지주의 사항이 있습니다. 객체에 프로토 타입에 속성이 첨부되어있을 수 있으며 in연산자 를 사용할 때 이러한 속성이 포함됩니다. 따라서 키가 프로토 타입이 아닌 인스턴스의 속성인지 확인해야합니다. 오래된 IE는 indexof(v)키로 표시 되는 것으로 알려져 있습니다.

for (const key in myDictionary) {
    if (myDictionary.hasOwnProperty(key)) {
        let value = myDictionary[key];
    }
}

3
머리카락을 나누려고하지는 않지만 유형 스크립트를 말하고 있기 때문에 var 키 대신 let 키를 사용하면 안됩니까? 좋은 답변 감사합니다.
Luke Dupin

3
사실, 현재 버전의 스크립트 유형에서는 keyand 일 value수 있습니다 const.
Patrick Desjardins

hasOwnProperty대상 객체에서 검사를 호출하지 않는 것이 좋습니다 . 대신 ...if (Object.prototype.hasOwnProperty.call(myDictionary, key))...eslint를 no-prototype-builtins규칙 과 함께 사용 하는 경우 오류가 발생합니다.
sceee

5

모든 사전 / 객체 값을 얻는 가장 짧은 방법 :

Object.keys(dict).map(k => dict[k]);

0

키를 얻으려면 :

function GetDictionaryKeysAsArray(dict: {[key: string]: string;}): string[] {
  let result: string[] = [];
  Object.keys(dict).map((key) =>
    result.push(key),
  );
  return result;
}

0

Ians Answer는 좋지만 키가 업데이트되지 않으므로 let 대신 const를 사용해야합니다.

for (const key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.