我有一个迭代器对象,我想获取满足测试函数的第一个元素。
Array.prototype.find
。例如使用 [...ducks].find((duck) => duck.age >= 3)
语法。
但我不想将迭代器转换为数组,因为这很浪费。在我的示例中,我有很多鸭子,我需要一只旧鸭子,只需几次测试即可找到。
我想知道是否存在一个优雅的解决方案。
没有内置任何内容,但您可以轻松地为其编写一个函数,将其粘贴到实用工具包中,然后重用它:
function find(it, callback) {
for (const value of it) {
if (callback(value)) {
return value;
}
}
}
用途:
const duck = find(ducks, (duck) => duck.age >= 3);
find
迭代器辅助方法(以及其他几个迭代器辅助方法)。
如果您的迭代器是由本机函数生成的(例如
Array#values
、生成器函数等),它将继承该方法。如果没有,只需将其转换为与 Iterator.from
相同的值即可。在此示例中,我从生成器函数定义了 ducks
,因此 find
是我可以调用它的方法:
// Mock for an iterator
const ducks = (function* () {
yield { age: 2 };
yield { age: 1 };
yield { age: 5 };
// Execution will not get at this point
console.log("this will not print");
yield { age: 4 };
})();
// Don't create array, but call find on iterator helper object
const oldDuck = ducks.find((duck) => duck.age >= 3);
console.log(oldDuck);