【问题标题】:How to call a function when all conditions are false within a loop当循环中的所有条件都为假时如何调用函数
【发布时间】:2019-10-10 01:49:26
【问题描述】:

所以我试图弄清楚如果所有 if/else 语句都是错误的,如何执行一个函数。下面是我目前正在使用的一段 sn-p 代码,它使用 for loop 检查对象中的值以迭代每个对象,然后检查 key/pairtechnology

如果所有语句都是假的,它应该返回或执行函数noMatch 当前sn-p 为每个else 语句执行函数noMatch。如果没有匹配的值,有没有办法只执行一次?

$(document).ready(function() {
    let object = [
        {
            "planId": "1",
            "technology": "LTE@Home"
        },
        {
            "planId": "2",
            "technology": "LTE@Home"
        },
        {
            "planId": "54",
            "technology": "home-prepaid-wifi"
        },
        {
            "planId": "0",
            "technology": "XTreme Prepaid",
        }
    ];


    let technology = "lte-technology";
    let dataObject = object;

    function match() {
        console.log("match");
    }

    function noMatch() {
        console.log("no match");
    }

    for (let key in dataObject) {
        let obj = dataObject[key];


        if(technology == obj.technology) {
            return match()

        } else {
            return noMatch()
        }
    }    

});

【问题讨论】:

  • 您通常会使用一个初始化为 false 的标志,如果任何条件为真,则该标志设置为 true。然后在处理结束时,如果它仍然是假的,那么所有的测试都是假的,你可以用这些信息做任何事情。你试过什么?
  • @RobG 我一直在想办法做到这一点。正在考虑执行另一个 if/else 语句来检查循环计数,一旦达到最后一个计数,它将返回或执行一个函数
  • 使用array.some的答案是最好的。数组原型函数既表达意图又使代码更简洁。

标签: javascript json


【解决方案1】:

您好,您可以使用Array.some

(() => {
    const items = [
        {
            "planId": "1",
            "technology": "LTE@Home"
        },
        {
            "planId": "2",
            "technology": "LTE@Home"
        },
        {
            "planId": "54",
            "technology": "home-prepaid-wifi"
        },
        {
            "planId": "0",
            "technology": "XTreme Prepaid",
        }
    ];
   
    const match = () => console.log("match");
    const noMatch = () => console.log("no match");
    const technology = "LTE@Home";    
    const hasMatch = items.some(x => x.technology === technology);
      
    return hasMatch ? match() : noMatch();     
})();

【讨论】:

    【解决方案2】:

    我认为数组原型方法some 在这种情况下效果很好:

    const technology = "lte-technology";
    const hasMatch = dataObj.some(obj => obj.technology === technology);
    

    【讨论】:

      【解决方案3】:

      最简洁的方式大概是Array.some(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)

      let hasMatch = dataObject.some(x => x.technology === technology);
      

      【讨论】:

        【解决方案4】:

        我无法找到副本,但我确定存在副本。

        根据 RobG 的评论,您设置了一个标志,并在循环完成后检查该标志。

        请注意,使用 javascript 的许多数组和对象方法中的 on 可能有一种更流畅的方式,但这是您修改后的代码以执行您想要的操作:

        let dataObject = [{
            "planId": "1",
            "technology": "LTE@Home"
          },
          {
            "planId": "2",
            "technology": "LTE@Home"
          },
          {
            "planId": "54",
            "technology": "home-prepaid-wifi"
          },
          {
            "planId": "0",
            "technology": "XTreme Prepaid",
          }
        ];
        
        let technology = "lte-technology";
        
        // set flag to false
        let hasMatch = false;
        for (let key in dataObject) {
          let obj = dataObject[key];
        
          // if the property matches, set flag to true
          // (never use ==  always use ===)
          if (technology === obj.technology) {
            hasMatch = true;
            // for performance, may as well stop the loop...
            break;
          }
        }
        
        if (hasMatch) {
          console.log('match');
        } else {
          console.log('nomatch');
        }

        请注意我关于使用 === 而不是 == 的评论 - 更多信息,see this Q&A

        【讨论】:

          【解决方案5】:

          这应该会有所帮助。

              let object = [
                  {
                      "planId": "1",
                      "technology": "LTE@Home"
                  },
                  {
                      "planId": "2",
                      "technology": "LTE@Home"
                  },
                  {
                      "planId": "54",
                      "technology": "home-prepaid-wifi"
                  },
                  {
                      "planId": "0",
                      "technology": "XTreme Prepaid",
                  }
              ];
          
          
              let technology = "lte-technology";
              let dataObject = object;
          
              function match() {
                  console.log("match");
              }
          
              function noMatch() {
                  console.log("no match");
              }
              let ok = false; 
              for (let key in dataObject) {
                  let obj = dataObject[key];
          
          
                  if(technology == obj.technology) {
                      ok= true; 
                       break;
                  } 
          
              }
                       if(ok)
                     return match();
                   return noMatch();     
          
          });
          
          

          【讨论】:

          • 我们可能必须在将break; 设置为true 或更好之后添加一条语句,但只需return match(); 而不是设置ok = true;
          • 你是对的。我要更改代码。谢谢先生。
          猜你喜欢
          • 1970-01-01
          • 2021-08-02
          • 1970-01-01
          • 2021-02-18
          • 1970-01-01
          • 2020-07-21
          • 1970-01-01
          • 2022-11-28
          • 2017-06-08
          相关资源
          最近更新 更多