시퀀스에 대한 Python 'enumerate'에 해당하는 ES6은 무엇입니까?


105

파이썬에는 반복 가능한 쌍 을 얻기위한 내장 함수가enumerate(index, item) 있습니다.

ES6에 어레이에 상응하는 기능이 있습니까? 뭔데?

def elements_with_index(elements):
    modified_elements = []
    for i, element in enumerate(elements):
         modified_elements.append("%d:%s" % (i, element))
    return modified_elements

print(elements_with_index(["a","b"]))
#['0:a', '1:b']

다음이없는 ES6 상당 enumerate:

function elements_with_index(elements){
     return elements.map(element => elements.indexOf(element) + ':' + element);
 }

console.log(elements_with_index(['a','b']))
//[ '0:a', '1:b' ]

하지만 map 또는 forEach는 이미이 작업을 수행합니다. 요소와 인덱스를 모두 얻을 수 있습니다
juvian dec.

@juvian이 말했듯이지도에서 사용 가능한 색인을 사용하지 않는 이유는 무엇입니까? elements.map(( element, i ) => `${ i }:${ element }`);
James Allardice

@JamesAllardice와 mozilla의 문서 :elements.map((element,index) => index + ':' + element)
Guillaume Vincent

답변:


112

예, 확인하세요 Array.prototype.entries().

const foobar = ['A', 'B', 'C'];

for (const [index, element] of foobar.entries()) {
  console.log(index, element);
}


4
이것은 매우 간단하고 멋집니다. enumerate보다 파이썬에 더 가깝고 [].map()반복자를 반환합니다.
Shanoor

3
이것은 map ((el, idx) => ..)을 사용하는 것과 동일하지 않습니다. 아마도 당신이 a를 수행하고 filter싶지만 필터링하기 전에 가지고 있던 인덱스를 유지하기를 원하기 때문입니다.
derekdreery

31

Array.prototype.map이미 콜백 프로 시저의 두 번째 인수로 인덱스를 제공합니다 . 거의 모든 곳 에서 지원됩니다 .

['a','b'].map(function(element, index) { return index + ':' + element; });
//=> ["0:a", "1:b"]

나도 ES6 좋아해

['a','b'].map((e,i) => `${i}:${e}`)
//=> ["0:a", "1:b"]

2
이 IMO에서 더 나은보다entries()
StephenBoesch

22

let array = [1, 3, 5];
for (let [index, value] of array.entries()) 
     console.log(index + '=' + value);


6

내가 무지하다면 실례합니다 (여기서 JavaScript에 대한 초보자 비트), 그냥 사용할 수 forEach없습니까? 예 :

function withIndex(elements) {
    var results = [];
    elements.forEach(function(e, ind) {
        results.push(`${e}:${ind}`);
    });
    return results;
}

alert(withIndex(['a', 'b']));

이 특정 사용 사례에 더 적합한 naomik의 답변 도 있지만 forEach청구서에 맞는 것을 지적하고 싶었습니다 .

ES5 + 지원.


5

pythonicenumerate배열뿐만 아니라 모든 이터 러블에서 작동 하는 함수를 제공하고 파이썬과 같이 Iterator를 반환합니다 .

import {enumerate} from 'pythonic';

const arr = ['a', 'b'];
for (const [index, value] of enumerate(arr))
    console.log(`index: ${index}, value: ${value}`);
// index: 0, value: a
// index: 1, value: b

공개 저는 Pythonic의 작성자이자 관리자입니다.


4
당신이 pythonic. Stack Overflow의 헬프 센터에서 스팸 발송자가 되지 않는 방법에 따르면 "여기의 커뮤니티는 명백한 자기 홍보에 투표 하지 않고 스팸으로 표시하는 경향이 있습니다. 좋은 관련 답변을 게시하고 일부 (전부는 아님) 귀하의 제품이나 웹 사이트는 괜찮아요. 하지만, 당신이 당신의 대답에 제휴를 공개해야합니다. "
솔로몬 Ucko

3
@Keyvan Solomon은 완전히 정확합니다. 귀하는이 라이브러리를 소유하고 있으며, 귀하는 단독 작성자이자 기여자입니다. 라이선스를 선택하는 방식은 관련이 없습니다. 게시물에서 추천하거나 링크하는 모든 라이브러리, 제품, 기사 등의 소유권 또는 관련성을 공개해야합니다. 이것은 매우 간단한 요구 사항이며 아무도 당신에게 무례하거나 불합리한 것을 요구하지 않습니다.
meagar

귀하의 요청에 따라 추가
Keyvan 19

2

같은 KyleShanoor말은 ) (Array.prototype.entries

그러나 나 같은 초보자에게는 그 의미를 완전히 이해하기가 어렵습니다.

그래서 여기에 이해할 수있는 예가 있습니다.

for(let curIndexValueList of someArray.entries()){
  console.log("curIndexValueList=", curIndexValueList)
  let curIndex = curIndexValueList[0]
  let curValue = curIndexValueList[1]
  console.log("curIndex=", curIndex, ", curValue=", curValue)
}

python코드 와 동일 :

for curIndex, curValue in enumerate(someArray):
  print("curIndex=%s, curValue=%s" % (curIndex, curValue))
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.