¿Cuál es el equivalente ES6 de Python 'enumerate' para una secuencia?

97

Python tiene una función incorporadaenumerate para obtener un iterable de (index, item)pares.

¿ES6 tiene un equivalente para una matriz? ¿Qué 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']

Equivalente a ES6 sin 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
fuente
pero map o forEach ya hace esto, puede obtener tanto el elemento como el índice
juvian
Como dice @juvian, ¿por qué no usar el índice disponible en el mapa? elements.map(( element, i ) => `${ i }:${ element }`);
James Allardice
@JamesAllardice con el documento de mozilla: elements.map((element,index) => index + ':' + element)
Guillaume Vincent

Respuestas:

104

Sí lo hay, echa un vistazo Array.prototype.entries().

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

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

Kyle
fuente
1
Esto, tan simple, tan genial. Está más cerca de Python enumerateque [].map(), devuelve un iterador.
Shanoor
2
Esto no es equivalente a usar map ((el, idx) => ..), ya que tal vez desee realizar una filterpero mantener los índices que tenía antes de filtrar.
derekdreery
26

Array.prototype.mapya le da el índice como segundo argumento para el procedimiento de devolución de llamada ... Y es compatible en casi todas partes.

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

También me gusta ES6

['a','b'].map((e,i) => `${i}:${e}`)
//=> ["0:a", "1:b"]
Gracias
fuente
esto es en mi opinión mejor queentries()
StephenBoesch
22

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

tav
fuente
5

Disculpe si estoy siendo ignorante (un poco novato en JavaScript aquí), pero ¿no puede simplemente usarlo forEach? p.ej:

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

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

También está la respuesta de naomik, que se adapta mejor a este caso de uso en particular, pero solo quería señalar que forEachtambién se ajusta a los requisitos.

Compatible con ES5 +.

James Ko
fuente
5

pythonicofrece una enumeratefunción que funciona en todos los iterables, no solo en matrices, y devuelve un iterador , como 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

Divulgación Soy autor y mantenedor de Pythonic

Keyvan
fuente
4
Por favor mencione que ayuda a desarrollar pythonic. De acuerdo con Cómo no ser un spammer en el Centro de ayuda de Stack Overflow, "La comunidad aquí tiende a rechazar la autopromoción abierta y marcarla como spam. Publica respuestas buenas y relevantes, y si algunas (pero no todas) son sobre su producto o sitio web, está bien. Sin embargo, debe revelar su afiliación en sus respuestas " .
Solomon Ucko
3
@Keyvan Solomon tiene toda la razón. Eres propietario de esta biblioteca, eres el único autor y colaborador de ella. La forma en que elige licenciarlo no es relevante. Debe revelar su propiedad o afiliación con cualquier biblioteca, producto, artículo, etc.que recomiende o enlace en sus publicaciones. Este es un requisito muy simple, nadie está siendo grosero con usted ni está pidiendo nada irrazonable.
meagar
Agregado por su solicitud
Keyvan
1

como Kyley Shanoordecir es Array.prototype.entries ()

pero para los novatos como yo, es difícil entender completamente su significado.

así que aquí da un ejemplo comprensible:

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

equivalente al pythoncódigo:

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