Что такое ES6-эквивалент Python enumerate для последовательности?

97

Python имеет встроенную функциюenumerate для получения итерации (index, item)пар.

Есть ли у ES6 эквивалент для массива? Что это такое?

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 без 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' ]
Гийом Винсент
источник
но map или forEach уже делают это, могут получить и элемент, и индекс
juvian
Как говорит @juvian, почему бы просто не использовать индекс, доступный на карте? elements.map(( element, i ) => `${ i }:${ element }`);
Джеймс Аллардис
@JamesAllardice с документом из Mozilla: elements.map((element,index) => index + ':' + element)
Гийом Винсент

Ответы:

104

Да, есть, проверьте Array.prototype.entries().

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

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

Кайл
источник
1
Это так просто и так круто. Он ближе к питону, enumerateчем [].map()возвращает итератор.
Shanoor
2
Это не эквивалентно использованию map ((el, idx) => ..), поскольку, возможно, вы захотите выполнить a, filterно сохранить индексы, которые были у вас до фильтрации.
derekdreery 05
26

Array.prototype.mapуже дает вам индекс в качестве второго аргумента процедуры обратного вызова ... И он поддерживается почти везде.

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

Мне тоже нравится ES6

['a','b'].map((e,i) => `${i}:${e}`)
//=> ["0:a", "1:b"]
Спасибо
источник
это imo лучше, чемentries()
StephenBoesch
5

Простите, если я невежественен (здесь я немного новичок в JavaScript), но вы не можете просто использовать forEach? например:

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

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

Также есть ответ Наомика, который лучше подходит для этого конкретного случая использования, но я просто хотел указать, что он forEachтакже отвечает всем требованиям.

ES5 + поддерживается.

Джеймс Ко
источник
5

pythonicпредлагает enumerateфункцию, которая работает со всеми итерациями, а не только с массивами, и возвращает Iterator , например 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

Раскрытие информации Я автор и сопровождающий Pythonic

Keyvan
источник
4
Пожалуйста, отметьте, что вы помогаете развиваться pythonic. Согласно статье « Как не быть спамером» в Справочном центре Stack Overflow: «Сообщество здесь имеет тенденцию голосовать против открытой саморекламы и отмечать ее как спам. Публикуйте хорошие, релевантные ответы, и если некоторые (но не все) будут о ваш продукт или веб-сайт, это нормально. Однако вы должны раскрывать свою принадлежность к своим ответам »,
Соломон Учко,
3
@Keyvan Соломон совершенно прав. Вы владеете этой библиотекой, являетесь единственным автором и участником ее. То, как вы выберете лицензию, не имеет значения. Вы должны раскрывать свое право собственности на любые библиотеки, продукты, статьи и т. Д., Которые вы рекомендуете или на которые ссылаетесь в своих сообщениях, или связаны с ними. Это очень простое требование, никто не грубит с вами и не просит ничего необоснованного.
meagar
Добавлено в ваш запрос
Keyvan
1

как Kyleи Shanoorговорят, Array.prototype.entries ()

но для новичков вроде меня трудно полностью понять его значение.

так что приведу понятный пример:

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

эквивалентно pythonкоду:

for curIndex, curValue in enumerate(someArray):
  print("curIndex=%s, curValue=%s" % (curIndex, curValue))
}
крифан
источник