【问题标题】:Javascript: action when a string is not found in an array of objects (if statement)Javascript:在对象数组中找不到字符串时的操作(if 语句)
【发布时间】:2016-04-14 23:08:11
【问题描述】:
var checkStore=function (book) {
    for (var i=0; i<BookStore.length;i++) {
        if (book==BookStore[i].title) {
            var reply= prompt ('Want to add to your cart?'+ BookStore[i].title);
            if (reply==='yes') {
                Susan.cart.push(BookStore[i]);
            }
        } 
    } 
}

如何在我现有的代码中添加“如果未找到该字符串,则提醒用户‘未找到!’”。我是使用 [else] 语句还是开始一个新语句?当我使用 else-if 语句时,它无法正常工作。

【问题讨论】:

  • 你的 else if 语句是什么样的?您不能真正在当前 if 上使用 else 语句,因为它会在循环的每次迭代中触发。您可以在迭代后检查一个布尔变量,以查看是否找到任何东西,然后提醒用户。

标签: javascript arrays string if-statement


【解决方案1】:

你可能想先找到这本书,然后按照你的逻辑:

var checkStore = function(book) {
    var found;
    for (var i = 0; i < BookStore.length; i++) {
        if (book == BookStore[i].title) {
            found = BookStore[i];
            break;
        }
    }
    if (found) {
        var reply = prompt ('Want to add to your cart?' + found.title);
        if (reply === 'yes') {
            Susan.cart.push(found);
        }
    } else {
        alert('not found!');
    } 
}

【讨论】:

    【解决方案2】:

    var checkStore=function (book) {
      if(BookStore.indexOf(book) < 0){
        alert('hello, no book');
       } else {
          for (var i=0; i<BookStore.length;i++) {
            if (book==BookStore[i].title) {
              var reply= prompt ('Want to add to your cart?'+ BookStore[i].title);
              if (reply==='yes') {
                Susan.cart.push(BookStore[i]);
              }
            }
         } 
        }
    }
    
    }
    

    【讨论】:

    • BookStore.indexOf()将再次迭代列表,加上book必须匹配元素title...
    【解决方案3】:

    其他答案完全有效。您也可以只创建在逻辑端点停止函数执行的返回点。

    var checkStore=function (book) {
        for (var i=0; i<BookStore.length;i++) {
            if (book==BookStore[i].title) {
                var reply= prompt ('Want to add to your cart?'+ BookStore[i].title);
                if (reply==='yes') {
                    Susan.cart.push(BookStore[i]);
                    return "book added to cart."
                }else{
                    return "book found, but not added to cart."
                }
            } 
        }
        return "bummer, book not found.";
    }
    
    alert(checkStore("book title"));
    

    【讨论】:

      【解决方案4】:

      最快的解决方案

      这是获取确切现有代码并添加几行并解决此问题的最短方法:How to add to my existing code "if the string is not found, then alert the user 'not found!'".

      var checkStore=function (book) {
          var bookWasFound=false;                    //Line added here
          for (var i=0; i<BookStore.length;i++) {
              if (book==BookStore[i].title) {
                  bookWasFound=true;                 //Line added here
                  var reply= prompt ('Want to add to your cart?'+ BookStore[i].title);
                  if (reply==='yes') {
                      Susan.cart.push(BookStore[i]);
                  }
              } 
          } 
          if (!bookWasFound) {                       //Line added here
              alert('Not found!');                   //Line added here
          }                                          //Line added here
      }
      

      解释和替代方案

      我们为什么不使用else 语句?

      你问,"Do I used [else] statement[...]?"

      你没有。你不能!原因是if-else 语句的else 部分在if 部分未执行时执行。所以如果我们把它放在我们的循环中,每次我们将书名与我们正在寻找的字符串进行比较时,如果书名不匹配,我们的 else 就会被执行。我们只希望这种情况发生一次。

      如果没有具体示例,很难考虑这种情况,所以我将展示如果我们使用 if-else 语句会发生什么。

      代码如下所示:

      if (book==BookStore[i].title) {
          ...
      } else {
          alert('Not found!');
      }
      

      假设我们的BookStore 包含 3 本书:"The C Programming language""JavaScript: Pocket Reference""Everybody Poops"。 如果checkStore 函数传入"JavaScript: Pocket Reference"。我们的循环会是这样的:

      一旦我们进入循环,book 将等于"JavaScript: Pocket Reference",而i = 0 所以BookStore[i].titleBookStore[0].title 相同,第0 本书的标题是"The C Programming language"

      所以if(book==BookStore[i].title) { 行会将"JavaScript: Poc...""The C Prog..." 进行比较并评估为假。
      由于if 被评估为假,else 部分被执行。 else 部分是alert('Not found!')

      现在,我们已经完成了循环的一次迭代,我们将传入的字符串与不匹配的第一本书的标题进行了比较,因此我们发出了警报。但我们不应该!如果我们继续前进,我们会看到第二本书的标题匹配,所以我们不应该告诉用户找不到该书。没有找到这本书是正确的,,但我们应该等到我们向用户宣布这一点。

      我可能已经非常详细地解释了我的观点,但我相信这非常重要。这是需要像程序员一样思考算法思考来解决问题的一个例子。

      你必须思考问题并问自己,"How do we know if a book is in the list?"。好吧,如果一本书的标题与列表中任何一本书的标题相同,那么它就在列表中。因为我们在说"...any book in the list" 时必须使用any这个词,所以我们知道我们的算法必须测试every 在列表中预订。

      在我们测试了列表中的每一本书或我们的BookStore 中的每一本书之前,我们无法告诉用户找到或未找到一本书。 直到我们的循环结束,我们才能告诉用户找到或未找到一本书。


      那我们该怎么办?

      在您的编程体验中,您会一遍又一遍地看到这种情况。您需要遍历一个列表,并确定 something 是否在列表中。

      在您遍历列表中的每个对象之前,您永远无法知道,但是一旦您知道了,您怎么知道答案?

      解决方案是使用编程中通常提到的标志flag 是具有两种可能状态的变量:truefalseonoff 10。你怎么称呼这些州并不重要。在任何时候,标志只能处于两种可能的状态之一。

      我们可以通过将标志设置为一个状态来使用它,通常是 false0,然后循环遍历某个列表,if (...) 我们将其设置为 真的。循环的每次迭代,如果满足某个条件,我们将标志设置为 true,并且在循环结束时,我们知道在循环中的某个点满足条件,如果标志为 true

      实现标志的最常见方法是使用布尔变量。也就是说,一个只能设置为truefalse的变量。在 Javascript 中,没有布尔变量,因为任何变量都可以设置为任何值。所以我们只使用一个常规变量,但仍然只将其设置为 truefalse

      我们这样做:

      var myFlag = false;
      // OR
      var myFlag = true;
      

      因此,标志的简单用法可能是确定给定数组中是否存在偶数。
      就像这样:

      var myArray = [1, 3, 5, 123, 125, 4, 89, 8, 10];
      var hasEven = false;
      
      for(var i = 0; i < myArray.length; i++) {
          if( myArray[i] % 2 == 0 ) {
              hasEven = true;
          }
      }
      
      if(hasEven) {
          alert('Found an even number!');
      } else {
          alert('Did not find an even number!');
      }
      

      注意,您可以使用if(variableName) 测试布尔(真或假)变量的值,您不必像if(variableName == true) 那样包含== true


      最终实现

      现在我们可以使用我们的flag 来解决我们原来的问题

      var checkStore = function(book) {
          var bookWasFound = false;
      
          for (var i = 0; i < BookStore.length; i++) {
              if (book == BookStore[i].title) {
                  // If we get in this loop, we must have found a match,
                  // so we should set our flag to true now
                  bookWasFound = true
      
                  var reply = prompt ('Want to add to your cart? ' + BookStore[i].title);
                  if (reply === 'yes') {
                      Susan.cart.push( BookStore[i] );
                  }
              } // End of if statement for prompt
      
          } // End of loop looking for book
      
          if( !bookWasFound ) {    // Same as if( bookWasFound == false )
              alert('Not found!');
          } 
      
      } // End of function
      

      使用这个标志可以让我们保持 for 循环内部非常干净和有条理,并处理它之外的结果。

      【讨论】:

        猜你喜欢
        • 2013-12-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        • 1970-01-01
        • 2019-11-01
        • 2017-08-27
        • 2021-08-08
        相关资源
        最近更新 更多