对于一个序列,什么是Python'枚举'的ES6等价物?

Gui*_*ent 60 javascript functional-programming ecmascript-6

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']
Run Code Online (Sandbox Code Playgroud)

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' ]
Run Code Online (Sandbox Code Playgroud)

Kyl*_*yle 49

是的,请查看Array.prototype.entries().

  • 这,太简单了,太酷了。它比 `[].map()` 更接近 python `enumerate`,它返回一个迭代器。 (5认同)
  • 这不等同于使用 map((el, idx) => ..),因为也许您想执行一个“过滤器”,但保留过滤前的索引。 (3认同)
  • 这如何与定义了“Symbol.iterator”函数的类型一起使用?Python 的对应项“enumerate”接受任何“iterable”。 (2认同)

tav*_*tav 21

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


Tha*_*you 18

Array.prototype.map已经给你一个指数作为第二个参数回调过程......而且它支持几乎无处不在.

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

我也喜欢ES6

['a','b'].map((e,i) => `${i}:${e}`)
//=> ["0:a", "1:b"]
Run Code Online (Sandbox Code Playgroud)

  • 我认为这比 `entries()` 更好 (3认同)

Jam*_* Ko 6

对不起,如果我无知(这里是 JavaScript 的新手),但你不能只使用forEach?例如:

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

alert(withIndex(['a', 'b']));
Run Code Online (Sandbox Code Playgroud)

还有naomik 的答案更适合这个特定用例,但我只想指出这forEach也符合要求。

支持 ES5+。


Key*_*van 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
Run Code Online (Sandbox Code Playgroud)

披露我是 Pythonic 的作者和维护者

  • 请提及您帮助开发`pythonic`。根据 Stack Overflow 帮助中心的 [如何不成为垃圾邮件发送者](https://stackoverflow.com/help/promotion),“这里的社区倾向于投票反对公开的自我宣传并将其标记为垃圾邮件。发布好,相关的答案,如果一些(但不是全部)恰好与您的产品或网站有关,那没关系。**但是,您必须在答案中披露您的从属关系。**” (4认同)
  • @Keyvan Solomon 是完全正确的。你拥有这个库,你是它的唯一作者和贡献者。您选择的许可方式无关紧要。您需要披露您在帖子中推荐或链接到的任何图书馆、产品、文章等的所有权或隶属关系。这是一个非常简单的要求,没有人对你无礼或要求任何不合理的事情。 (3认同)