Bir dizi için Python 'numaralandırmanın' ES6 eşdeğeri nedir?


97

Python, yinelenebilir çiftler elde etmek için yerleşikenumerate bir işleve sahiptir (index, item).

ES6'nın bir dizi için bir karşılığı var mı? Bu ne?

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 eşdeğeri 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' ]

ancak map or forEach bunu zaten yapın, hem elementi hem de dizini alabilir
juvian

@Juvian'ın dediği gibi, neden sadece haritadaki dizini kullanmıyorsunuz? elements.map(( element, i ) => `${ i }:${ element }`);
James Allardice

Mozilla'dan doktorla @JamesAllardice: elements.map((element,index) => index + ':' + element)
Guillaume Vincent

Yanıtlar:


105

Evet var, kontrol edin Array.prototype.entries().

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

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


1
Bu çok basit, çok havalı. Python'a bir yineleyiciden enumeratedaha yakın [].map().
Shanoor

2
Bu, map ((el, idx) => ..) kullanmaya eşdeğer değildir, çünkü belki bir yapmak filterama filtrelemeden önce sahip olduğunuz dizinleri korumak istersiniz.
derekdreery

26

Array.prototype.mapZaten geri arama prosedürünün ikinci argümanı olarak dizini size veriyor ... Ve neredeyse her yerde destekleniyor .

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

Ben de ES6'yı seviyorum

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

Bu imo daha iyientries()
StephenBoesch

22

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


5

Cahil oluyorsam özür dilerim (burada JavaScript'e biraz acemi), ama kullanamaz forEachmısın? Örneğin:

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

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

Ayrıca naomik'in bu özel kullanım durumu için daha uygun bir cevabı var, ancak forEachbunun faturaya da uyduğunu belirtmek istedim .

ES5 + desteklenir.


5

pythonicenumeratesadece dizilerde değil, tüm yinelenenlerde çalışan ve python gibi bir Yineleyici döndüren bir işlev sunar :

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

Açıklama Pythonic'in yazarı ve bakımcısıyım


4
Lütfen gelişmeye yardımcı olduğunuzu belirtin pythonic. Stack Overflow'un Yardım Merkezinde nasıl spam gönderici olunmamasına göre , "Buradaki topluluk açık bir şekilde kendi tanıtımını oylama ve spam olarak işaretleme eğilimindedir. İyi, alakalı yanıtlar gönderin ve bazıları (hepsi olmasa da) ürününüz veya web siteniz, sorun değil. Ancak, yanıtlarınızda bağlılığınızı belirtmelisiniz. "
Solomon Ucko

3
@Keyvan Solomon tamamen doğru. Bu kitaplığın sahibi sizsiniz, tek yazarı ve katkıda bulunan sizsiniz. Lisans verme şekliniz alakalı değil. Yazılarınızda tavsiye ettiğiniz veya bağlantı verdiğiniz herhangi bir kitaplık, ürün, makale vb. Sahipliğinizi veya bunlarla ilişkinizi açıklamanız gerekmektedir. Bu çok basit bir gereklilik, kimse size kaba davranmıyor veya mantıksız bir şey istemiyor.
meagar

İsteğinize göre eklendi
Keyvan

1

olarak Kyleve Shanoormesela olan ) (Array.prototype.entries

ama benim gibi yeni başlayanlar için anlamını tam olarak anlamak zor.

işte anlaşılır bir örnek verelim:

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

pythonkoda eşdeğer :

for curIndex, curValue in enumerate(someArray):
  print("curIndex=%s, curValue=%s" % (curIndex, curValue))
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.