Що таке 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)
Гійом Вінсент

Відповіді:


105

Так, перевірте Array.prototype.entries().

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

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


1
Це, так просто, так класно. Це ближче до python, enumerateніж [].map(), він повертає ітератор.
Шанур

2
Це не еквівалентно використанню map ((el, idx) => ..), оскільки, можливо, ви хочете виконати, filterале збережіть індекси, які були у вас до фільтрації.
derekdreery

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

це вже краще, ніжentries()
Стівен Бош,


5

Вибачте, якщо я незнаю (трохи тут новачок у JavaScript), але чи не можете ви просто використовувати forEach? наприклад:

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

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

Є також відповідь naomik, яка найкраще підходить для цього конкретного випадку використання, але я просто хотів зазначити, що це forEachтакож відповідає законопроекту.

Підтримується ES5 +.


5

pythonicпропонує enumerateфункцію, яка працює на всіх ітерабелях, а не тільки на масивах, і повертає ітератор , як 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


4
Будь ласка, згадайте, що ви допомагаєте розвиватися pythonic. Відповідно до статті Як не бути спамером у довідковому центрі Stack Overflow, "Спільнота тут має тенденцію голосувати проти відвертої самореклами та позначати це як спам. Публікуйте хороші відповідні відповіді, і якщо деякі (але не всі) трапляються приблизно ваш продукт або веб-сайт, це нормально. Однак ви повинні розкрити свою приналежність у своїх відповідях ".
Соломон Уцко,

3
@Keyvan Solomon абсолютно правильний. Ви є власником цієї бібліотеки, ви є єдиним її автором та автором. Вибір ліцензії не є актуальним. Ви зобов’язані розкрити своє право власності на будь-які бібліотеки, продукти, статті тощо, які ви рекомендуєте або посилаєтеся на них у своїх публікаціях, або пов’язані з ними. Це дуже проста вимога, ніхто не поводиться з вами грубо і не просить чогось нерозумного.
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))
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.