最快的解决方案
这是获取确切现有代码并添加几行并解决此问题的最短方法: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].title 与BookStore[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 是具有两种可能状态的变量:true 或 false、on 或 off 、是或否、1或0。你怎么称呼这些州并不重要。在任何时候,标志只能处于两种可能的状态之一。
我们可以通过将标志设置为一个状态来使用它,通常是 false 或 0,然后循环遍历某个列表,if (...) 我们将其设置为 真的。循环的每次迭代,如果满足某个条件,我们将标志设置为 true,并且在循环结束时,我们知道在循环中的某个点满足条件,如果标志为 true。
实现标志的最常见方法是使用布尔变量。也就是说,一个只能设置为true或false的变量。在 Javascript 中,没有布尔变量,因为任何变量都可以设置为任何值。所以我们只使用一个常规变量,但仍然只将其设置为 true 或 false。
我们这样做:
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 循环内部非常干净和有条理,并处理它之外的结果。