ES6反向迭代一个使用的数组,我是否错过了规格中的某些东西?

问题描述 投票:0回答:3
在ES6中,我们现在有

术语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); } }());

<pre id="out"></pre>

这确实是在ES6中打算反向迭代的方式,或者我错过了规格中的基本内容?
	
  这确实是在ES6中打算反向迭代的方式?
有一个反复迭代的建议,在
esdicuss

和一个概述

spec

的git项目上进行了讨论,但似乎没有太多发生。 ES6现在已完成,因此这次不是要添加的东西。无论如何,对于阵列和字符串,我编写了一些代码来填补空白(我认为),我会在这里发布它,因为它可能会对他人有所帮助。该代码基于我今天的浏览器,如果对其进行更多的ES6实施,则可能会进行一些改进。稍后,我可能会开始一个要点或小型GitHub项目。

update:我为此创建了一个工作。
javascript arrays iterator reverse ecmascript-6
3个回答
8
投票
请看一下
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()

fitlerslice


3
投票
等。

如果您需要一个数组或查询中的地图,则可以使用concat
.toArray()

.toMap()
方法之一。

如果您的输入是一个数组,那么您实现的是一种很好的方法:在核心上,您有一个带有索引变量降低的循环。它只会消耗O(1)辅助空间来实现目标。
作为替代方案,您还可以使用Ecmascript 2023介绍的一种方法,该方法反向迭代数组,例如
.toSet()
for
,并使用回调来访问每个元素,并确保此回调永远不会返回真实的值: 


findLast


0
投票
这并不是真正的迭代器,但它确实允许以功能性的方式对数组进行反向遍历。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.