对于一个序列,ES6相当于Python的“枚举”是什么?

Python有一个内置的函数枚举,以获得可迭代的对。(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' ]

答案 1

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

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

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

答案 2

Array.prototype.map

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

让它变得懒惰

但是,python是懒惰的,所以我们也应该对这个特征进行建模 -enumerate

function* enumerate (it, start = 0)
{ let i = start
  for (const x of it)
    yield [i++, x]
}

for (const [i, x] of enumerate("abcd"))
  console.log(i, x)
0 a
1 b
2 c
3 d

指定第二个参数 , 允许调用方控制索引的转换 -start

for (const [i, x] of enumerate("abcd", 100))
  console.log(i, x)
100 a
101 b
102 c
103 d