Was ist das ES6-Äquivalent von Python 'enumerate' für eine Sequenz?

100

Python verfügt über eine integrierte Funktionenumerate , um eine Iteration von (index, item)Paaren zu erhalten.

Hat ES6 ein Äquivalent für ein Array? Was ist es?

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-Äquivalent ohne 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
quelle
aber map oder forEach tun dies bereits, können sowohl Element als auch Index erhalten
juvian
Wie @juvian sagt, warum nicht einfach den in der Karte verfügbaren Index verwenden? elements.map(( element, i ) => `${ i }:${ element }`);
James Allardice
@ JamesAllardice mit dem Doc von Mozilla: elements.map((element,index) => index + ':' + element)
Guillaume Vincent

Antworten:

107

Ja, checkt aus Array.prototype.entries().

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

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

Kyle
quelle
2
Das so einfach, so cool. Es ist näher an der Python enumerateals [].map()es gibt einen Iterator zurück.
Shanoor
3
Dies ist nicht gleichbedeutend mit der Verwendung von map ((el, idx) => ..), da Sie möglicherweise eine ausführen möchten, filteraber die Indizes beibehalten möchten , die Sie vor dem Filtern hatten.
Derekdreery
30

Array.prototype.mapgibt Ihnen bereits den Index als zweites Argument für die Rückrufprozedur ... Und er wird fast überall unterstützt.

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

Ich mag auch ES6

['a','b'].map((e,i) => `${i}:${e}`)
//=> ["0:a", "1:b"]
Vielen Dank
quelle
2
das ist imo besser alsentries()
StephenBoesch
22

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

tav
quelle
6

Entschuldigen Sie, wenn ich unwissend bin (ein bisschen ein Neuling in JavaScript hier), aber können Sie nicht einfach verwenden forEach? z.B:

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

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

Es gibt auch die Antwort von naomik, die besser zu diesem speziellen Anwendungsfall passt, aber ich wollte nur darauf hinweisen, dass sie forEachauch zur Rechnung passt.

ES5 + wird unterstützt.

James Ko
quelle
5

pythonicbietet eine enumerateFunktion, die auf allen iterablen Elementen und nicht nur auf Arrays funktioniert und einen Iterator wie Python zurückgibt :

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

Offenlegung Ich bin Autor und Betreuer von Pythonic

Keyvan
quelle
4
Bitte erwähnen Sie, dass Sie bei der Entwicklung helfen pythonic. Laut " Wie man kein Spammer ist" in der Hilfe von Stack Overflow: "Die Community hier neigt dazu, offene Eigenwerbung abzustimmen und als Spam zu kennzeichnen. Veröffentlichen Sie gute, relevante Antworten, und wenn es um einige (aber nicht alle) geht Ihr Produkt oder Ihre Website, das ist in Ordnung. Sie müssen jedoch Ihre Zugehörigkeit in Ihren Antworten offenlegen. "
Solomon Ucko
3
@ Keyvan Solomon ist völlig richtig. Sie besitzen diese Bibliothek, Sie sind der alleinige Autor und Mitwirkende daran. Die Art und Weise, wie Sie es lizenzieren, ist nicht relevant. Sie müssen Ihr Eigentum an oder Ihre Zugehörigkeit zu Bibliotheken, Produkten, Artikeln usw. offenlegen, die Sie in Ihren Posts empfehlen oder auf die Sie verlinken. Dies ist eine sehr einfache Anforderung, niemand ist unhöflich zu Ihnen oder bittet um etwas Unvernünftiges.
Meagar
Hinzugefügt auf Ihre Anfrage
Keyvan
2

wie Kyleund Shanoorsagen ist Array.prototype.entries ()

aber für Neulinge wie mich ist es schwer, seine Bedeutung vollständig zu verstehen.

Geben Sie hier ein verständliches Beispiel:

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

entspricht pythonCode:

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