【问题标题】:Compare values in an array using if conditions in a for loop使用 for 循环中的 if 条件比较数组中的值
【发布时间】:2018-06-16 07:01:22
【问题描述】:

所以我在 ionic 项目中使用 Ocrad.js 库来读取图像中的文本。在应用程序中,用户可以将“项目”(如单词)添加到数组中,然后我想检查这些项目(单词)是否存在于图像的文本中。例如:如果图像有一个句子:“我喜欢足球”,并且用户在列表中添加了“足球”这个词,按下按钮,应用程序将检查“我喜欢”中是否存在“足球”足球”,并会这样告诉用户。在其他场合,它也会这么说。

到目前为止,我想出了这种情况:

for(let item of this.itemList) {
    if(text.indexOf(item.name)>=0){
        alert('word found');

    } else {
        alert('word not found');
    }
  } 

这个想法是遍历用户添加到数组中的项目(单词)列表,并为它们提供适当的响应。虽然如果我只添加一个单词,就像我上面提到的足球示例一样,但如果我在列表中添加更多单词,循环显然会给我 2 个警报。因此,如果将“足球”一词添加到列表中并因此有一个包含“足球”和“足球”的数组,我会收到 2 个警报,这是有道理的,因为我没有停止循环。所以我尝试了一个开关盒,由于某种原因它不起作用(我真的不知道为什么,但它一直给我两个警报)。这是我的开关的样子:

 for(let item of this.itemList){
        switch(true){
            case (text.indexOf(item.name)>=0): {
                alert('word found');
                break;
            }
            case (text.indexOf(item.name) <= 0):{
                alert('word not found');
                break;
            }
            default: {
                alert('please add a word to the list');
                break;
            }
        }
      }

所以在玩耍和研究之后,我真的找不到对我有很好帮助的东西。同样的想法是,如果图像文本说“我喜欢足球”并且我在数组中添加 3 个项目:“足球”、“篮球”、“足球”,那么答案将只是“找到单词”,而如果单词不是在那里,我只会得到一次“找不到单词”!我相信我可能会做一些非常愚蠢的事情,我用我的菜鸟的眼睛看不到哈哈。我希望我的问题是有道理的。谁能帮我这个?伙计们干杯!

编辑 - 这是我实际使用的相机功能:

onAnalyze() {
    let matchFound = false;
    let loader = this.loadingCtrl.create({
     content: 'Please wait...'
    });
    loader.present();
    (<any>window).OCRAD(document.getElementById('image'), text => {       
      loader.dismissAll();
      alert(text);
      console.log(text);


        for(const item of this.itemList) 
                {
                    if(text.indexOf(item) >=0){
                        matchFound = true;
                        break;
                    }
                }

                if(found){
                    alert('word found!');
                } else{
                    alert('word not found!');
                }

            }
          );

       }

【问题讨论】:

    标签: arrays typescript for-loop if-statement ionic-framework


    【解决方案1】:

    在您提供的第一个示例中,for 循环继续评估输入字符串,即使您已经找到了匹配项(我相信这就是您想要的,对于任意数量的成功匹配项只看到一个警报)。下面的示例引入了一个布尔值matchFound,它在第一次匹配时设置为true。如果找到匹配项,我们break 退出 for 循环,终止其执行(并阻止 N 次警报):

    const itemList = ['football', 'nachos', 'sports'];
    const textFromImage = 'I like football and nachos';
    isTextPresent(itemList, textFromImage);
    
    function isTextPresent(itemList: string[], textFromImage: string) {
      let matchFound = false;
      for (const item of this.itemList) {
        if (textFromImage.indexOf(item) >= 0) {
          matchFound = true;
          break;
        }
      }
    
      if (matchFound) {
          alert('word found');
      } else {
          alert('word not found');
      }
    }
    

    FWIW,Array.prototype.some() 也可以在这里使用。在textFromImage 的第一场比赛中,它终止(很像第一个示例中中断的 for 循环):

    const itemList = ['football', 'nachos', 'sports'];
    const textFromImage = 'I like football and nachos';
    isTextPresent(itemList, textFromImage);
    
    function isTextPresent(itemList: string[], textFromImage: string) {
      const matchFound = itemList.some((item: string) => {
        return textFromImage.indexOf(item) >= 0;
      });
    
      if (matchFound) {
          alert('word found');
      } else {
          alert('word not found');
      }
    }
    

    【讨论】:

      【解决方案2】:

      您应该使用嵌套的 for 循环。

      let words = ['soccer', basketball', 'football']
      let foundedWords = []
      for(let item of this.itemList) {
      for(let word in words){
          if(text.indexOf(word)>=0){
      foundedWords.push(word)
              alert('word found');
      
          } else {
              alert('word not found');
          }
      }
        } 
      

      最后你会得到一个已建立词的列表。 我认为这对你来说应该没问题。

      【讨论】:

      • 嘿 Zrelli,我试图实现你的想法,但它并没有真正奏效(也许我最有可能做错了什么),但感谢你的建议!
      • 请写完整的代码,我会解决你的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多