2015-08-08 102 views
0

我想知道爲什麼代碼輸出錯誤,當你可以看到週三= 34的對象。我想我可能有問題,改變我的變量。試圖循環通過一個數組元素是對象

var lookup = [{"Monday" : 12}, {"Wednesday" : 34},{"Thursday" : 0},{"Saturday" : 56} ] 
// console.log(lookup[1]["Wednesday"] == 34) // prints out true 
function ami(day, num){ 
    var a; 
    for(var i = 0; i < lookup.length; i++){ 
     if(lookup[i][day] == num || 
      day == "Tuesday" && num >95 || 
      day == "Friday" && num %2 == 0 || 
      day == "Sunday" && num == 666 || 
      day == "Sunday" && num == -666){ 
      a = true 
     }else{ 
      a = false 
     } 

    } 
    return a; 

} 
console.log(ami("Wednesday", 34)) 

回答

0

您與for循環的每個迭代重寫a值。實質上,您正在做的是檢查lookup數組的最後一項,因爲之前的結果總是被覆蓋。

我不知道你想要什麼來實現的條件,但是這可能是你所需要的:

function ami(day, num){ 
    for(var i = 0; i < lookup.length; i++){ 
     if(lookup[i][day] == num || 
      day == "Tuesday" && num >95 || 
      day == "Friday" && num %2 == 0 || 
      day == "Sunday" && num == 666 || 
      day == "Sunday" && num == -666){ 
      return true; 
     } 
    } 
    return false; 
} 
+0

這使我我想要的結果我本來真假不'了'變量。最初我把return False放在了前面的右括號之前,就是在你顯示的代碼中返回false之前。爲什麼我不能將返回false置於for循環中,因爲我能夠將返回值設爲true。感謝您的回答。 –

0

當你的代碼達到I = 1,被確實設置爲true 。但在此之後,循環被允許繼續,所以當我增加到2時,a又被設置爲假。

您可以從函數返回,儘快解決這個問題,你確定返回值應該是真實的:

var lookup = [{"Monday" : 12}, {"Wednesday" : 34},{"Thursday" : 0},{"Saturday" : 56} ] 
function ami(day, num){ 
    for(var i = 0; i < lookup.length; i++){ 
     if(lookup[i][day] == num || 
      day == "Tuesday" && num >95 || 
      day == "Friday" && num %2 == 0 || 
      day == "Sunday" && num == 666 || 
      day == "Sunday" && num == -666){ 
      return true; 
     } 
    } 
} 
console.log(ami("Wednesday", 34)); 

你甚至可以進一步簡化代碼,如果你使用普通的對象作爲你的查找表:

var lookup = {"Monday" : 12, "Wednesday" : 34, "Thursday" : 0, "Saturday" : 56}; 
function ami(day, num){ 
    return (lookup[day] == num || 
     day == "Tuesday" && num >95 || 
     day == "Friday" && num %2 == 0 || 
     day == "Sunday" && num == 666 || 
     day == "Sunday" && num == -666); 
} 
console.log(ami("Wednesday", 34)); 
+0

我很想知道當for循環中的條件返回false時會發生什麼。循環會在結束條件滿足之前結束?這個話題可能是我得到意想不到的結果的原因嗎?我把'a'變成了可變的東西,因爲我的布爾人被退回的方式沒有解決,所以我決定嘗試一些新的東西。 –

+1

是的,你可以通過使用'return'語句(結束循環所在的函數)或'break'語句離開循環,它只會結束它所在的循環。還有'continue'語句,這會跳過當前迭代的循環體的其餘部分。 但是,這與評估爲false的條件無關。如果你想過早地退出循環,你必須明確地告訴JavaScript解釋器這樣做(或者你調用的函數必須拋出一個你不能捕獲的異常)。 –

0

A Array.some()應該這樣做。

var lookup = [{ "Monday": 12 }, { "Wednesday": 34 }, { "Thursday": 0 }, { "Saturday": 56 }]; 
 
function ami(day, num) { 
 
    return lookup.some(function (a) { return a[day] === num; }) || 
 
     day == "Tuesday" && num > 95 || 
 
     day == "Friday" && num % 2 == 0 || 
 
     day == "Sunday" && num == 666 || 
 
     day == "Sunday" && num == -666 
 
} 
 
document.write(ami("Wednesday", 34));

另一possibillity是查找陣列的一個對象與不止一個屬性優化,像

var lookup = { "Monday": 12, "Wednesday": 34, "Thursday": 0, "Saturday": 56 }; 

另一個版本是這樣的。我拿了你的代碼,改變了條件和循環條件的行爲。因此,首先評估給定的條件,然後在必要時對數組進行迭代。採用變量a以及停止迭代以及返回值的指示符。

var lookup = [{ "Monday": 12 }, { "Wednesday": 34 }, { "Thursday": 0 }, { "Saturday": 56 }]; 
 
function ami(day, num) { 
 
    var a = false; 
 
    if (day == "Tuesday" && num > 95 || 
 
     day == "Friday" && num % 2 == 0 || 
 
     day == "Sunday" && num == 666 || 
 
     day == "Sunday" && num == -666) { 
 
     a = true; 
 
    } 
 
    for (var i = 0; !a && i < lookup.length; i++) { 
 
     a = lookup[i][day] == num; 
 
    } 
 
    return a; 
 
} 
 
document.write(ami("Wednesday", 34));