术语和for..of迭代它们。我们有一些用于arrays的内置;值得注意的是keys,值和 这些方法允许人们执行通常执行的大部分迭代。但是,反向迭代呢?这也是一项非常普遍的任务,我在Spec中没有专门为此看到任何东西吗?也许我错过了? ok,我们有
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);
}
}());
这确实是在ES6中打算反向迭代的方式?
和一个概述
spec的git项目上进行了讨论,但似乎没有太多发生。 ES6现在已完成,因此这次不是要添加的东西。无论如何,对于阵列和字符串,我编写了一些代码来填补空白(我认为),我会在这里发布它,因为它可能会对他人有所帮助。该代码基于我今天的浏览器,如果对其进行更多的ES6实施,则可能会进行一些改进。稍后,我可能会开始一个要点或小型GitHub项目。
update:我为此创建了一个工作。Https://www.npmjs.com/package/itiriri.
这是一个具有与数组相似的方法的库,但可以与迭代器一起使用。
import { query } from 'itiriri';
const m = new Map();
m.set(1, 'a');
m.set(2, 'b');
m.set(3, 'c');
const result = query(m);
for (const [k, v] of result.reverse()) {
console.log(k + ' - ' + v)
}
query
返回具有与数组相似的方法的峰值。在上面的示例中,使用了。还有reverse()
fitler
,slice
如果您需要一个数组或查询中的地图,则可以使用concat
,.toArray()
.toMap()
方法之一。
如果您的输入是一个数组,那么您实现的是一种很好的方法:在核心上,您有一个带有索引变量降低的循环。它只会消耗O(1)辅助空间来实现目标。
作为替代方案,您还可以使用Ecmascript 2023介绍的一种方法,该方法反向迭代数组,例如
.toSet()
for
,并使用回调来访问每个元素,并确保此回调永远不会返回真实的值:
findLast