使用for循环中的if条件比较数组中的值

时间:2018-01-06 19:21:44

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

所以我在离子项目中使用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!');
                }

            }
          );

       }

2 个答案:

答案 0 :(得分:0)

你应该使用嵌套的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');
    }
}
  } 

最后,您将获得已创建单词的列表。 我认为这应该没问题。

答案 1 :(得分:0)

在你提供的第一个例子中,for循环继续评估输入字符串,即使你已经找到匹配(我相信你想要的,只能看到任意数量的成功匹配的一个警报) )。以下示例引入了布尔值break,在第一次匹配时设置为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'); } } 。如果找到匹配项,我们{for循环'textFromImage,终止执行(并阻止N个警报):

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

FWIW,Array.prototype.some()也可以在这里使用。在{{1}}的第一个匹配中,它终止(非常类似于第一个示例中断开的for循环):

{{1}}