【问题标题】:What is the ES6 equivalent of Python 'enumerate' for a sequence?什么是 ES6 等效的 Python 'enumerate' 序列?
【发布时间】:2016-03-24 01:28:24
【问题描述】:

Python 有一个 built-in function 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']

没有enumerate的ES6等价物:

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 所说,为什么不直接使用地图中可用的索引呢? elements.map(( element, i ) => `${ i }:${ element }`);
  • @JamesAllardice 与来自 mozilla 的文档:elements.map((element,index) => index + ':' + element)

标签: javascript functional-programming ecmascript-6


【解决方案1】:

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

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

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

【讨论】:

  • 这个,太简单了,太酷了。它比[].map()更接近pythonenumerate,它返回一个迭代器。
  • 这不等同于使用 map((el, idx) => ..),因为您可能想要执行 filter 但保留过滤前的索引。
  • 这对于定义了Symbol.iterator 函数的类型如何工作? Python 对应的 enumerate 接受任何 iterable
【解决方案2】:

Array.prototype.map

Array.prototype.map 已经为您提供了索引作为回调过程的第二个参数...而且它几乎无处不在 supported

['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

【讨论】:

  • 这比entries() imo 好
  • @StephenBoesch 这取决于.. break .map 方法是否可行?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

    还有naomik's 答案更适合此特定用例,但我只想指出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 的作者和维护者

      【讨论】:

      • 请提及您帮助开发pythonic。根据 Stack Overflow 帮助中心的How to not be a spammer,“这里的社区倾向于否决公开的自我推销并将其标记为垃圾邮件。发布好的、相关的答案,如果某些(但不是全部)恰好与您的产品或网站,没关系。但是,您必须在回答中披露您的从属关系。"
      • @Keyvan Solomon 是完全正确的。你拥有这个库,你是它的唯一作者和贡献者。您选择许可的方式不相关。您需要披露您在帖子中推荐或链接到的任何图书馆、产品、文章等的所有权或从属关系。这是一个非常简单的要求,没有人对你无礼或要求任何不合理的东西。
      • 根据您的要求添加
      【解决方案6】:

      作为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))
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-27
        • 1970-01-01
        • 1970-01-01
        • 2023-02-16
        • 2016-12-09
        • 2020-10-17
        相关资源
        最近更新 更多