循环
如何在 forEach 中终止循环
在遍历一个很大的对象,如果我们只想获得第一个符合条件的值,为了避免性能浪费,我们需要终止后续的循环。此时我们终止循环。
在 for 循环中,我们可以使用 break
关键字
const obj = {
a: "aa",
b: "bb",
};
for (const [k, v] of Object.entries(obj)) {
console.log("💡", k);
if (k === "a") {
break;
}
}
// 💡 a
但是 for 是语句,如果在 forEach 方法中,我们应该使用抛出错误的方式终止循环
function getData(obj) {
try {
Object.entries(obj).forEach(([k, v]) => {
console.log("💡", k);
if (k === "a") {
throw new Error("EndIteration");
}
});
} catch (e) {
if (e.message === "EndIteration") {
}
}
}
看上去有点丑陋而且没必要?我们将这个方法封装一下试试
function findOne(computer) {
try {
Object.entries(this).forEach(([k, v]) => {
console.log("💡", k);
if (computer(k, v)) {
throw new Error("EndIteration");
}
});
} catch (e) {
if (e.message === "EndIteration") {
}
}
}
Object.prototype.findOne = findOne;
obj.findOne((k) => k === "a");
// 💡 a
这样用起就可以调用任意对象上的 findOne
且它是惰性的。(灵感来源:Figma 的 findOne 方法)