Qual é o equivalente ES6 de Python 'enumerar' para uma sequência?

105

Python tem uma função embutidaenumerate , para obter um iterável de (index, item)pares.

O ES6 tem um equivalente para um array? O que é isso?

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 equivalente sem 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
fonte
mas map ou forEach já faz isso, pode obter o elemento e o índice
2015
Como @juvian diz, por que não usar apenas o índice disponível no mapa? elements.map(( element, i ) => `${ i }:${ element }`);
James Allardice
@JamesAllardice com o doc de Mozilla: elements.map((element,index) => index + ':' + element)
Guillaume Vincent

Respostas:

112

Sim, há, verifique Array.prototype.entries().

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

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

Kyle
fonte
4
Isso, tão simples, tão legal. Está mais próximo do python enumeratedo [].map()que retorna um iterador.
Shanoor
3
Isso não é equivalente a usar map ((el, idx) => ..), já que talvez você queira executar um, filtermas manter os índices que tinha antes de filtrar.
derekdreery
31

Array.prototype.mapjá fornece o índice como o segundo argumento para o procedimento de retorno de chamada ... E é suportado em quase todos os lugares.

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

Eu gosto de ES6 também

['a','b'].map((e,i) => `${i}:${e}`)
//=> ["0:a", "1:b"]
Obrigado
fonte
2
isto é imo melhor do queentries()
StephenBoesch
22

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

tav
fonte
6

Desculpe-me se estou sendo ignorante (um pouco novato em JavaScript aqui), mas você não pode simplesmente usar forEach? por exemplo:

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

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

Também há a resposta de naomik, que se encaixa melhor neste caso de uso específico, mas eu só queria ressaltar que forEachtambém se encaixa no projeto.

ES5 + com suporte.

James Ko
fonte
5

pythonicoferece uma enumeratefunção que funciona em todos os iteráveis, não apenas arrays, e retorna um Iterator , 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

Divulgação Sou autor e mantenedor do Pythonic

Keyvan
fonte
4
Por favor, mencione que você ajuda a desenvolver pythonic. De acordo com How to not be a spammer no Help Center do Stack Overflow, "A comunidade aqui tende a votar contra a autopromoção aberta e sinalizá-la como spam. Publique respostas boas e relevantes e se algumas (mas não todas) forem sobre seu produto ou site, tudo bem. No entanto, você deve divulgar sua afiliação em suas respostas. "
Solomon Ucko
3
@Keyvan Solomon está completamente correto. Você é o proprietário desta biblioteca, é o único autor e contribuidor dela. A forma como você escolhe licenciar não é relevante. Você é obrigado a divulgar sua propriedade ou afiliação a quaisquer bibliotecas, produtos, artigos, etc. que você recomende ou vincule em suas postagens. Este é um requisito muito simples, ninguém está sendo rude com você ou pedindo algo irracional.
meagar
Adicionado por sua solicitação
Keyvan
2

como Kylee Shanoordizer é Array.prototype.entries ()

mas para novatos como eu, é difícil entender totalmente o seu significado.

então dê um exemplo compreensível:

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 ao pythoncódigo:

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