Apa ekuivalen ES6 dari Python 'enumerate' untuk urutan?

97

Python memiliki fungsienumerate bawaan, untuk mendapatkan (index, item)pasangan yang dapat diulang .

Apakah ES6 memiliki padanan untuk sebuah array? Apa itu?

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']

Setara dengan ES6 tanpa 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' ]
Guillaume Vincent
sumber
tapi map atau forEach sudah melakukan ini, bisa mendapatkan elemen dan indeks
juvian
Seperti yang dikatakan @juvian, mengapa tidak menggunakan indeks yang tersedia di peta saja? elements.map(( element, i ) => `${ i }:${ element }`);
James Allardice
@JamesAllardice dengan dokumen dari mozilla: elements.map((element,index) => index + ':' + element)
Guillaume Vincent

Jawaban:

105

Ya ada, periksa Array.prototype.entries().

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

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

Kyle
sumber
1
Ini, sangat sederhana, sangat keren. Ini lebih dekat ke python enumeratedaripada [].map(), ia mengembalikan iterator.
Shanoor
2
Ini tidak sama dengan menggunakan map ((el, idx) => ..), karena mungkin Anda ingin melakukan filtertetapi tetap menggunakan indeks yang Anda miliki sebelum memfilter.
derekdery
26

Array.prototype.mapsudah memberi Anda indeks sebagai argumen kedua untuk prosedur callback ... Dan itu didukung hampir di semua tempat.

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

Saya suka ES6 juga

['a','b'].map((e,i) => `${i}:${e}`)
//=> ["0:a", "1:b"]
Terima kasih
sumber
ini imo lebih baik daripadaentries()
StephenBoesch
22

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

tav
sumber
5

Maaf jika saya bodoh (sedikit pemula di JavaScript di sini), tetapi tidak bisakah Anda menggunakan saja forEach? misalnya:

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

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

Ada juga jawaban naomik yang lebih cocok untuk kasus penggunaan khusus ini, tetapi saya hanya ingin menunjukkan bahwa itu forEachjuga sesuai dengan tagihan.

ES5 + didukung.

James Ko
sumber
5

pythonicmenawarkan enumeratefungsi yang bekerja pada semua iterable, bukan hanya array, dan mengembalikan Iterator , seperti python:

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

Pengungkapan Saya penulis dan pengelola Pythonic

Keyvan
sumber
4
Harap sebutkan bahwa Anda membantu mengembangkan pythonic. Menurut Cara untuk tidak menjadi pelaku spam di Pusat Bantuan Stack Overflow, "Komunitas di sini cenderung menolak promosi diri secara terbuka dan menandainya sebagai spam. Posting jawaban yang baik dan relevan, dan jika beberapa (tetapi tidak semua) kebetulan tentang produk atau situs web Anda, tidak apa-apa. Namun, Anda harus mengungkapkan afiliasi Anda dalam jawaban Anda. "
Solomon Ucko
3
@Kvan Solomon sepenuhnya benar. Anda pemilik perpustakaan ini, Anda adalah satu-satunya penulis dan kontributor perpustakaan ini. Cara Anda memilih untuk melisensikannya tidak relevan. Anda diharuskan untuk mengungkapkan kepemilikan atau afiliasi Anda dengan perpustakaan, produk, artikel, dll. Yang Anda rekomendasikan atau tautkan dalam posting Anda. Ini adalah persyaratan yang sangat sederhana, tidak ada yang bersikap kasar kepada Anda atau meminta sesuatu yang tidak masuk akal.
meagar
Ditambahkan sesuai permintaan Anda
Keyvan
1

sebagai Kyledan Shanoorkatakan adalah Array.prototype.entries ()

tapi untuk pemula seperti saya, sulit untuk memahami maknanya.

jadi di sini berikan contoh yang bisa dimengerti:

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

setara dengan pythonkode:

for curIndex, curValue in enumerate(someArray):
  print("curIndex=%s, curValue=%s" % (curIndex, curValue))
}
crifan
sumber