Javascript 从嵌套函数内的forEach循环内退出主函数
我有一个JSON对象,它包含一个对象数组。我还有一个所需值的数组,我想在JSON中搜索这些值。我只关心第一场比赛。如果未找到匹配项,则抛出错误 也许有更好的方法可以做到这一点,但这就是我想到的:Javascript 从嵌套函数内的forEach循环内退出主函数,javascript,jquery,Javascript,Jquery,我有一个JSON对象,它包含一个对象数组。我还有一个所需值的数组,我想在JSON中搜索这些值。我只关心第一场比赛。如果未找到匹配项,则抛出错误 也许有更好的方法可以做到这一点,但这就是我想到的: function myFunction() { $.getJSON('database.json') .done(db => { for (let i = 0; i < desiredValues.length; i++) { db.a
function myFunction() {
$.getJSON('database.json')
.done(db => {
for (let i = 0; i < desiredValues.length; i++) {
db.arrayOfObjects.forEach(object => {
if (object.propertyValue === desiredValues[i]) {
console.log("Match found!");
return; // break out of myFunction()
}
});
}
throw Error("Match not found.");
})
.fail(error => {
throw Error("getJSON request failed.\n" + error);
})
}
函数myFunction(){
$.getJSON('database.json')
.done(数据库=>{
for(设i=0;i{
if(object.propertyValue===desiredValues[i]){
log(“找到匹配项!”);
return;//从myFunction()中中断
}
});
}
抛出错误(“未找到匹配项”);
})
.fail(错误=>{
抛出错误(“getJSON请求失败。\n”+错误);
})
}
我的问题是return语句只会中断forEach的当前迭代(为什么?)。剩余的对象仍将测试desiredValues的所有剩余值,并且始终抛出错误。找到匹配项后,如何完全退出myFunction(),或者如何重新构造此函数以实现所需的功能
编辑:我可能应该提到,我还需要对匹配的对象执行一些操作,因此,如果存在匹配项,则不仅仅返回true。forEach内部
return
的问题在于它只终止当前forEach回调-这就是return
的作用,它停止函数的当前执行并(可能)返回一个值,而不影响该函数未来可能的调用
使用两个嵌套的Array.prototype。一些
替代,一旦找到匹配项,它们将立即中断并返回true
,然后完全迭代并返回false
,否则:
const isFound = desiredValues.some(valueToFind => (
db.arrayOfObjcts.some(({ propertyValue }) => (
object.propertyValue === valueToFind
))
));
if (!isFound) {
throw new Error('Match not found');
}
或者,如果您不习惯于分解参数:
const isFound = desiredValues.some(valueToFind => (
db.arrayOfObjcts.some(object => (
propertyValue === valueToFind
))
));
if (!isFound) {
throw new Error('Match not found');
}
要识别找到的值,请使用。查找
代替外部循环:
const valueFound = desiredValues.find(valueToFind => (
db.arrayOfObjcts.some(({ propertyValue }) => (
object.propertyValue === valueToFind
))
));
if (!valueFound) {
throw new Error('Match not found');
}
只需使用
。在数组中查找
function myFunction() {
$.getJSON('database.json')
.done(db => {
for (let i = 0; i < desiredValues.length; i++) {
if (
db.arrayOfObjects
.find(object => object.propertyValue === desiredValues[i])
!== undefined
) {
console.log("Found match! Matched value:", desiredValues[i]);
return;
}
throw Error("Match not found.");
})
.fail(error => {
throw Error("getJSON request failed.\n" + error);
})
}
或。过滤以获得所有匹配的值:
function myFunction() {
$.getJSON('database.json')
.done(db => {
const values = db.arrayOfObjects.map(object => object.propertyValue);
const matches = values.filter(value => desiredValues.includes(value));
if (matches.length) {
console.log("Found", matches.length, "matches! Matched values:", matches);
return;
}
throw Error("Match not found.");
})
.fail(error => {
throw Error("getJSON request failed.\n" + error);
})
}
为了回答OP对其原始代码提出的一个小问题,return语句仅在forEach的当前迭代中中断,因为return语句位于每次forEach迭代期间调用的回调中。如果我想确定哪个对象具有匹配的值,该怎么办?我可以只在内部循环中使用.find吗?@MatheusLeão Yes-对内部循环使用.find
,并在仍然在外部循环中的情况下将结果分配给外部变量。在第二个示例中,如果值与零匹配,函数是否仍会抛出错误?这似乎正是我所需要的,除了if语句可能需要更具体一点。@MatheusLeão谢谢,我在试图最小化代码并使其更可读时忘记检查它
function myFunction() {
$.getJSON('database.json')
.done(db => {
const values = db.arrayOfObjects.map(object => object.propertyValue);
const matches = values.filter(value => desiredValues.includes(value));
if (matches.length) {
console.log("Found", matches.length, "matches! Matched values:", matches);
return;
}
throw Error("Match not found.");
})
.fail(error => {
throw Error("getJSON request failed.\n" + error);
})
}