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

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


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

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


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 +.


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


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))
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.