ES6使用for..of反向迭代一个数组,我错过了规范中的内容吗?

Xot*_*750 12 javascript arrays reverse iterator ecmascript-6

在ES6中,我们现在有迭代器for..of来迭代它们.我们有一些数组内置函数 ; 特别是,条目.

这些方法允许人们执行通常执行的大部分迭代.但是,反向迭代怎么样?这也是一个非常常见的任务,我没有在规范中看到任何具体的内容吗?或许我错过了?

好的,我们有Array.prototype.reverse但是我不一定想要在适当的位置反转大型数组,然后在完成时再次反转它.我也不想使用Array.prototype.slice来制作一个临时的浅拷贝并反转那个迭代.

所以我看了一下发电机并提出了这些有效的解决方案.

(function() {
  'use strict';

  function* reverseKeys(arr) {
    let key = arr.length - 1;

    while (key >= 0) {
      yield key;
      key -= 1;
    }
  }

  function* reverseValues(arr) {
    for (let key of reverseKeys(arr)) {
      yield arr[key];
    }
  }

  function* reverseEntries(arr) {
    for (let key of reverseKeys(arr)) {
      yield [key, arr[key]];
    }
  }

  var pre = document.getElementById('out');

  function log(result) {
    pre.appendChild(document.createTextNode(result + '\n'));
  }

  var a = ['a', 'b', 'c'];

  for (var x of reverseKeys(a)) {
    log(x);
  }

  log('');
  for (var x of reverseValues(a)) {
    log(x);
  }

  log('');
  for (var x of reverseEntries(a)) {
    log(x);
  }
}());
Run Code Online (Sandbox Code Playgroud)
<pre id="out"></pre>
Run Code Online (Sandbox Code Playgroud)

这是否真的是ES6中反向迭代的方式,或者我错过了规范中的基本内容?

Xot*_*750 8

这是否真的是ES6中反向迭代的方式?

有一个关于反向迭代的提议,在esdicuss和一个概述规范的git项目上进行了讨论,但似乎没有什么事情可以发生.ES6现在已经完成,因此这次不会添加.无论如何,对于数组和字符串,我写了一些代码来填补空白(在我看来),我会在这里发布,因为它可能会帮助其他人.此代码基于我今天的浏览器,如果在其上实现了更多的ES6,则可能会进行一些改进.我稍后可能会到达一个要点或一个小的github项目.

更新:我已经创建了一个GitHub项目来处理这个问题.