Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从嵌套函数内的forEach循环内退出主函数_Javascript_Jquery - Fatal编程技术网

Javascript 从嵌套函数内的forEach循环内退出主函数

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

我有一个JSON对象,它包含一个对象数组。我还有一个所需值的数组,我想在JSON中搜索这些值。我只关心第一场比赛。如果未找到匹配项,则抛出错误

也许有更好的方法可以做到这一点,但这就是我想到的:

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);
      })
}