我有以下代码:
function* getPossibleCollidersWith(shape) {
for (let square of retrieve(shape)) {
for (let neighbor of square) {
yield neighbor;
}
}
}
这可行,但使用生成器和产量,这非常慢。我使用 Chrome 的分析器对其进行了基准测试,它的性能比删除生成器并仅迭代客户端代码中的嵌套循环要低得多。 但是,每次我想要获取形状的邻居时,都要执行嵌套循环,这需要大量的样板代码。我想创建一个自定义迭代器来看看它是否比生成器函数具有更好的性能,但我看到的所有示例都相当复杂,并且涉及跟踪索引、空值等。
有没有简单的方法可以将上面的代码转换为自定义迭代器?理想情况下,我想继续使用
for of
循环来返回每个元素,但我在网上看到的所有示例都涉及容易出错的索引跟踪。
如果可能的话,我希望客户端代码看起来像这样:for (let neighbor of getPossibleCollidersWith(shape)) {
// handle neighbor
}
for
循环通常是对可迭代对象执行遍历的最有效方法,但从优雅的角度来看,您可以使用 ECMAScript 2025 中引入的
flatMap
迭代器辅助函数。如果 retrieve(shape)
返回一个迭代器,你可以这样做:
function getPossibleCollidersWith(shape) {
return retrieve(shape).flatMap(Object);
}
或者如果它不返回迭代器,而只是返回一个可迭代对象,那么:
function getPossibleCollidersWith(shape) {
return Iterator.from(retrieve(shape)).flatMap(Object);
}
传递给
flatMap
的回调在这种情况下应该只返回没有变化的平方,所以我们只需要像
x => x
这样的恒等映射。 Object
在这种情况下实现了相同的效果。