Jaki jest odpowiednik „enumerate” w ES6 dla sekwencji w Pythonie?

105

Python ma wbudowaną funkcjęenumerate , która umożliwia uzyskanie iterowalnych (index, item)par.

Czy ES6 ma odpowiednik dla tablicy? Co to jest?

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

Odpowiednik ES6 bez 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
źródło
ale map lub forEach już to robią, mogą uzyskać zarówno element, jak i indeks
juvian
Jak mówi @juvian, dlaczego nie skorzystać po prostu z indeksu dostępnego na mapie? elements.map(( element, i ) => `${ i }:${ element }`);
James Allardice
@JamesAllardice z dokumentem z Mozilli: elements.map((element,index) => index + ':' + element)
Guillaume Vincent

Odpowiedzi:

112

Tak jest, sprawdź Array.prototype.entries().

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

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

Kyle
źródło
4
To takie proste, takie fajne. Jest bliżej Pythona enumerateniż [].map()zwraca iterator.
Shanoor
3
Nie jest to równoznaczne z użyciem map ((el, idx) => ..), ponieważ może chcesz wykonać a, filterale zachowaj indeksy, które miałeś przed filtrowaniem.
derekdreery
31

Array.prototype.mapjuż podaje indeks jako drugi argument procedury wywołania zwrotnego ... I jest obsługiwany prawie wszędzie.

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

ES6 też lubię

['a','b'].map((e,i) => `${i}:${e}`)
//=> ["0:a", "1:b"]
Dziękuję Ci
źródło
2
to jest imo lepsze niżentries()
StephenBoesch
22

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

tav
źródło
6

Przepraszam, jeśli jestem ignorantem (trochę nowicjuszem w JavaScript), ale czy nie możesz po prostu użyć forEach? na przykład:

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

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

Jest też odpowiedź Naomika, która lepiej pasuje do tego konkretnego przypadku użycia, ale chciałem tylko zaznaczyć, że forEachrównież pasuje do rachunku.

Obsługiwany ES5 +.

James Ko
źródło
5

pythonicoferuje enumeratefunkcję, która działa na wszystkich iterowalnych elementach, nie tylko na tablicach, i zwraca Iterator , jak 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

Ujawnienie Jestem autorem i opiekunem Pythonic

Keyvan
źródło
4
Wspomnij, że pomagasz się rozwijać pythonic. Zgodnie z artykułem How to not a spammer w Centrum pomocy Stack Overflow: „Społeczność ma tendencję do odrzucania jawnej autopromocji i oznaczania jej jako spamu. Publikuj dobre, trafne odpowiedzi, a jeśli niektóre (ale nie wszystkie) dotyczą Twój produkt lub witryna, nic nie szkodzi. Jednak w odpowiedziach musisz ujawnić swoje powiązanie.
Solomon Ucko
3
@Keyvan Solomon ma całkowitą rację. Jesteś właścicielem tej biblioteki, jesteś jedynym autorem i współautorem. Sposób, w jaki zdecydujesz się na to licencję, nie ma znaczenia. Jesteś zobowiązany do ujawnienia swojego prawa własności lub przynależności do jakichkolwiek bibliotek, produktów, artykułów itp., Które polecasz lub do których zamieszczasz linki w swoich postach. To bardzo prosty wymóg, nikt nie jest dla ciebie niegrzeczny ani nie prosi o coś nierozsądnego.
meagar
Dodano na twoją prośbę
Keyvan
2

jak Kylei Shanoorpowiedz, to Array.prototype.entries ()

ale dla początkujących, takich jak ja, trudno jest w pełni zrozumieć jego znaczenie.

więc tutaj podaj zrozumiały przykład:

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

odpowiednik pythonkodu:

for curIndex, curValue in enumerate(someArray):
  print("curIndex=%s, curValue=%s" % (curIndex, curValue))
}
crifan
źródło