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

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);
}


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

ini imo lebih baik daripadaentries()
StephenBoesch

22

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


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.


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


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))
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.