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

时间:2019-03-24 01:16:02

标签: javascript jquery

我有一个包含对象数组的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);
    })
}

我的问题是return语句仅出现在forEach的当前迭代中(为什么?)。其余对象仍将测试所需的Value的所有剩余值,并且始终会引发错误。找到匹配项后,如何完全退出myFunction();或者如何重组此函数以实现所需的功能?

编辑:我可能应该提到我还需要对匹配的对象进行处理,因此如果 匹配,则 just 不返回true。

2 个答案:

答案 0 :(得分:2)

returnforEach的问题在于,它仅终止当前的forEach回调-这就是return的工作,它会停止当前执行函数,并(可能)返回一个值,而不会影响该函数将来的调用。

请改用两个嵌套的Array.prototype.some,它们将立即脱离嵌套并在找到匹配项后返回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');
}

要标识找到的值,请对外部循环使用.find

const valueFound = desiredValues.find(valueToFind => (
  db.arrayOfObjcts.some(({ propertyValue }) => (
    object.propertyValue === valueToFind
  ))
));
if (!valueFound) {
  throw new Error('Match not found');
}

答案 1 :(得分:1)

只需在数组上使用.find

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

或映射对象数组,并将.find.includes混合:

function myFunction() {
    $.getJSON('database.json')
      .done(db => {
        const values = db.arrayOfObjects.map(object => object.propertyValue);

        const match = values.find(value => desiredValues.includes(value)); 

        if (match !== undefined) {
          console.log("Found match! Matched value:", match);
          return;
        }

        throw Error("Match not found.");
      })
      .fail(error => {
        throw Error("getJSON request failed.\n" + error);
      })
}

.filter以获得所有匹配的值:

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