序列的Python“枚举”的ES6等效项是什么?


104

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 2015年

正如@juvian所说,为什么不只使用地图中可用的索引?elements.map(( element, i ) => `${ i }:${ element }`);
James Allardice 2015年

@JamesAllardice和来自mozilla的文档:elements.map((element,index) => index + ':' + element)
纪尧姆·文森特

Answers:


111

是的,有,请退房Array.prototype.entries()

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

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


3
这个,那么简单,那么酷。它enumerate比python更接近python [].map(),它返回一个迭代器。
Shanoor

3
这不等同于使用map((el,idx)=> ..),因为您可能想执行a,filter但保留过滤前的索引。
derekdreery

31

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

2
这比imo好得多entries()
StephenBoesch

22

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


6

对不起,如果我很无知(这里是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对所有可迭代对象(不仅是数组)都适用的函数,并返回了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的作者和维护者


4
请提及您将帮助您发展pythonic。根据Stack Overflow帮助中心的“如何成为垃圾邮件发送者”的说法,“这里的社区倾向于否决公开的自我宣传,并将其标记为垃圾邮件。发布好的,相关的答案,以及是否有一些(但不是全部)有关您的产品或网站,没关系。但是,您必须在回答中公开您的隶属关系。
所罗门·乌科

3
@Keyvan Solomon是完全正确的。您拥有这个库,是它的唯一作者和贡献者。您选择的许可方式无关紧要。您必须在您的帖子中披露您推荐或链接的任何库,产品,文章等的所有权或从属关系。这是一个非常简单的要求,没有人对您无礼或要求任何不合理的要求。
meagar

根据您的请求添加
-Keyvan

2

作为KyleShanoor说的是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))
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.