for-of 루프 내에서 ES6 배열 요소 인덱스에 액세스


226

for-of 루프를 사용하여 배열 요소에 액세스 할 수 있습니다.

for (const j of [1, 2, 3, 4, 5]) {
  console.log(j);
}

이 코드를 수정하여 현재 색인에도 액세스하려면 어떻게해야합니까? forEach 또는 for-in이 아닌 for-of 구문을 사용하여 이것을 달성하고 싶습니다.

답변:


347

사용 Array.prototype.keys:

for (const index of [1, 2, 3, 4, 5].keys()) {
  console.log(index);
}

키와 값 모두에 액세스하려면 다음 Array.prototype.entries()과 같이 구조화 하여 사용할 수 있습니다 .

for (const [index, value] of [1, 2, 3, 4, 5].entries()) {
  console.log(index, value);
}


64
누군가 궁금해하는 경우 테스트 for-of.entries()했는데에 비해 두 배 느립니다 .forEach(). jsperf.com/for-of-vs-foreach-with-index

1
@ K48 알아두면 좋을 것입니다. es에서 가장 빠른 속도를 원하면 "역순 루프"를 사용하십시오. incredible-web.com/blog/…
nimo23

3
불행히도 중첩 루프 내부에서 양보해야합니다. 함수가 yield키워드에 대한 범위 문제를 생성하므로 forEach를 사용할 수 없습니다 . 그러나 유스 케이스에 대한 색인에 액세스해야하므로 기본 오래된 ;;루프입니다.
Kyle Baker

2
@KyleBaker 그리고 for-of 루프의 문제점은 무엇 .entires()입니까?
Michał Perłakowski

1
대신 리버스 루프 길이 jsperf.com/reverse-loop-vs-cache를 캐시 할 수 있습니다 . RAM에 큰 배열을 만들지 않고 스트림을 처리 할 수있을 때 반복 가능한 처리에 유용합니다. 이러한 경우 I / O 대기 시간이 발생하므로 루프 속도에 병목 현상이 발생하지 않습니다.
x'ES

289

Array#entries 둘 다 필요한 경우 인덱스와 값을 반환합니다.

for (let [index, value] of array.entries()) {

}

3
TypeScript 사용 : 'TS2495 : Type IterableIterator는 배열 유형 또는 문자열 유형이 아닙니다'. 이 해결 될 것 같아 : github.com/Microsoft/TypeScript/pull/12346
요하네스

2
또한 Internet Explorer는 지원되지 않습니다.
Sammi

1
좋지 않아. 예를 들어 , 아마도 다른 많은 DOM 반복 가능한 구조와 함께 document.styleSheets[0].cssRules.entries()또는 document.styleSheets.entries()아마도 오류를 던집니다 . 아직 사용해야 _.forEach()에서lodash
스티븐 Pribilinskiy

2
@Steven : 인덱스가 필요하지 않으면 할 수 있습니다 for (var value of document.styleSheets) {}. 인덱스를해야하는 경우 당신은을 통해 먼저 배열에 값을 변환 할 수 있습니다 Array.from: for (let [index, value] of Array.from(document.styleSheets)) {}.
Felix Kling

1
멋지다! Array.fromFTW
Steven Pribilinskiy 2016 년

28

화려하고 새로운 기본 기능의 세계에서 우리는 때로는 기본 사항을 잊어 버립니다.

for (let i = 0; i < arr.length; i++) {
    console.log('index:', i, 'element:', arr[i]);
}

깨끗하고 효율적이며 여전히 break루프를 수행 할 수 있습니다 . 보너스! 또한 끝에서 시작하여 i--!

추가 참고 사항 : 루프 내에서 값을 많이 사용하는 const value = arr[i];경우 쉽고 읽기 쉬운 참조를 위해 루프 상단에서 수행 할 수 있습니다 .


1
네. 명확하고 간단합니다. 아, 그렇게하면 배열의 키 / 인덱스에 액세스하는 매우 쉬운 방법이 있습니다.
결합

2
그건 그렇고 조건은 다음과 같아야합니다-> for (let i = 0; i <arr.length; i ++) (-1)이 없으면 배열의 모든 요소를 ​​반복하지 않습니다.
결합

1
@Combine Good catch! 귀하의 메모를 반영하여 답변을 업데이트했습니다.
chris

4
당신은 여전히 수 하고 읽기 훨씬 쉽습니다. 뒤로 이동하는 것은 추가하는 것만 큼 쉽습니다 . breakfor-offor (let [index, value] of array.entries()).reverse()
Nigel B. Peck

2
나는 이것이이 질문에 대한 완벽한 대답이라고 생각합니다. 그것은 대답이 될 수는 없지만이 질문을 검색 한 수십 명 이상의 사람들에게 도움이되었습니다. 이것이 바로 SO입니다.
Danoram

3

html / js 컨텍스트, 최신 브라우저에서 Arrays 이외의 반복 가능한 객체와 함께 [Iterable] .entries ()를 사용할 수도 있습니다.

for(let [index, element] of document.querySelectorAll('div').entries()) {

    element.innerHTML = '#' + index

}

예, 이것은 작동하지만 @Steven Pribilinskiy가 위에서 언급 한 다른 DOM 메소드는 entries메소드 가없는 객체를 반환 합니다.
matanster

3

A의 for..of루프 우리는이를 통해 달성 할 수있다 array.entries(). array.entries새로운 Array 반복자 객체를 반환합니다. 반복자 객체는 해당 시퀀스 내에서 현재 위치를 추적하면서 한 번에 반복 가능한 항목에서 항목에 액세스하는 방법을 알고 있습니다.

next()이터레이터 에서 메소드가 호출 되면 키 값 쌍이 생성됩니다. 이러한 키 값 쌍에서 배열 인덱스 는 키이고 배열 항목은 값입니다.

let arr = ['a', 'b', 'c'];
let iterator = arr.entries();
console.log(iterator.next().value); // [0, 'a']
console.log(iterator.next().value); // [1, 'b']

for..of루프는 기본적으로 반복 가능한 소비하고 (후드 반복기를 사용하는) 모든 요소를 순환 구성체이다. 우리는 이것을 array.entries()다음과 같은 방식으로 결합 할 수 있습니다 :

array = ['a', 'b', 'c'];

for (let indexValue of array.entries()) {
  console.log(indexValue);
}


// we can use array destructuring to conveniently
// store the index and value in variables
for (let [index, value] of array.entries()) {
   console.log(index, value);
}


3

당신은 필요한 경우는 인덱스를 직접 처리 할 수있는 인덱스를 , 당신은 필요가 작동하는지 키를 .

let i = 0;
for (const item of iterableItems) {
  // do something with index
  console.log(i);

  i++;
}

0

Array배열과 같거나 배열 이 아닌 객체를 사용하는 사람들은 자신 만의 iterable을 쉽게 빌드 할 수 있으므로 실제로 다음 for of과 같은 것들 localStorage에만 사용할 수 있습니다 length.

function indexerator(length) {
    var output = new Object();
    var index = 0;
    output[Symbol.iterator] = function() {
        return {next:function() {
            return (index < length) ? {value:index++} : {done:true};
        }};
    };
    return output;
}

그런 다음 숫자를 먹이십시오.

for (let index of indexerator(localStorage.length))
    console.log(localStorage.key(index))

0

es6 for...in

for(const index in [15, 64, 78]) {                        
    console.log(index);
}

5
문제는 for...of루프 에 대한 질문이 아니라for...in
Abraham Hernandez

3
for...in원래 ECMAScript 사양 (예 : "es1")의 일부입니다. 또한 for...in객체 속성을 반복하기위한 것입니다. 배열을 반복 할 수는 있지만 예상 한 순서로 수행하지 않을 수 있습니다. MDN 문서
Boaz

0

다른 접근법은 다음 Array.prototype.forEach()과 같이 사용할 수 있습니다.

Array.from({
  length: 5
}, () => Math.floor(Math.random() * 5)).forEach((val, index) => {
  console.log(val, index)
})


-6
var fruits = ["apple","pear","peach"];
for (fruit of fruits) {
    console.log(fruits.indexOf(fruit));
    //it shows the index of every fruit from fruits
}

for 루프는 배열을 순회하지만 indexof 속성은 배열과 일치하는 인덱스 값을 가져옵니다. PD이 방법에는 몇 가지 결함이 있으므로 과일을 사용하십시오.


2
O (n ^ 2) 시간이 걸립니다.
Harry

3
성능이 중요하지 않은 경우에도 중복 된 결과가있을 때 올바른 인덱스를 모두 제공하지는 않습니다. 예를 들어, ["apple", "apple", "pear"]지정된 색인의 경우 0, 0, 2대신입니다 0, 1, 2.
trichoplax
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.