…의 인덱스 / 키를위한 TypeScript?


146

여기에 설명 된 것처럼 TypeScript는 foreach 루프를 소개합니다.

var someArray = [9, 2, 5];
for (var item of someArray) {
    console.log(item); // 9,2,5
}

그러나 색인 / 키가 없습니까? 나는 다음과 같은 것을 기대할 것이다.

for (var item, key of someArray) { ... }

답변:


274

.forEach 이미이 능력이 있습니다 :

const someArray = [9, 2, 5];
someArray.forEach((value, index) => {
    console.log(index); // 0, 1, 2
    console.log(value); // 9, 2, 5
});

그러나의 기능을 원한다면 인덱스와 값으로 배열을 for...of할 수 있습니다 map.

for (const { index, value } of someArray.map((value, index) => ({ index, value }))) {
    console.log(index); // 0, 1, 2
    console.log(value); // 9, 2, 5
}

조금 길어서 재사용 가능한 함수에 넣는 것이 도움이 될 수 있습니다.

function toEntries<T>(a: T[]) {
    return a.map((value, index) => [index, value] as const);
}

for (const [index, value] of toEntries(someArray)) {
    // ..etc..
}

반복 가능한 버전

--downlevelIteration컴파일러 옵션으로 컴파일하면 ES3 또는 ES5를 대상으로 지정할 때 작동 합니다.

function* toEntries<T>(values: T[] | IterableIterator<T>) {
    let index = 0;
    for (const value of values) {
        yield [index, value] as const;
        index++;
    }
}

Array.prototype.entries ()-ES6 +

ES6 + 환경을 대상으로 할 수 있으면 Arnavion의 답변에.entries() 설명 된 방법을 사용할 수 있습니다 .


그러나 TypeScript는 "for ... of"를 인덱스 "var _i"를 가진 간단한 "for"로 컴파일합니다. 따라서 TypeScript 개발자는이 _i를 쉽게 사용할 수 있습니다. 놀이터 예 참조 : bit.ly/1R9SfBR
Mick

2
@ 대상에 따라 다릅니다. ES6로 변환 할 때 그렇게하지 않습니다. 코드 변환시 추가 코드가 필요한 이유는 ES6 코드가 이전 버전에서 작동하도록하기 위해서입니다.
David Sherret

3
어떻게 휴식을 취할 수 있습니까? 그 각각을 위해?
João Silva


@ JoãoSilva 당신은 Array.some()중지하고 싶은 반복에서 사용 하고 거짓을 반환 할 수 있습니다 . 거의 명확하지 않거나 예쁘지 break않지만 작업이 완료됩니다. 개인적으로 나는 그것을 좋아하지 않는다. 아마 다른 방법으로 반복을 다시 쓸 것이다 :) stackoverflow.com/questions/2641347/…
Neek


35

구식의 "오래된 학교 자바 스크립트"(기능 프로그래밍에 익숙하지 않거나 익숙하지 않은 사람들을 위해)

for (let i = 0; i < someArray.length ; i++) {
  let item = someArray[i];
}

2
나는 실제로이 답변을 가장 선호합니다. 각 요소에 대한 색인을 생성하기 위해 추가 방법을 사용하지 않습니다.
bluegrounds

youuu veryyyy muuuchh 감사합니다! 우리는 이것을 몰랐습니다 :)
TSR

14

for..in TypeScript 연산자를 사용하여 컬렉션을 다룰 때 인덱스에 액세스 할 수 있습니다 .

var test = [7,8,9];
for (var i in test) {
   console.log(i + ': ' + test[i]);
} 

산출:

 0: 7
 1: 8
 2: 9

데모 보기


"i"는 for..in 루프의 int가 아닌 문자열입니다. "i"로 산술 연산을 수행하면 문자열이 연결됩니다. (i + 1)은 예를 들어 i = 0 인 경우 "01"과 같습니다
Stéphane

for..in또한 객체에 선언 된 모든 함수가 포함되어 있기 때문에 예상보다 많은 것을 줄 수 있습니다. 예 :for (var prop in window.document) { console.log(prop); }
Ken Lyon

5

또는 다른 구식 솔루션 :

var someArray = [9, 2, 5];
let i = 0;
for (var item of someArray) {
    console.log(item); // 9,2,5
    i++;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.