跳到主要内容

循环

如何在 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 方法)