2015-08-08 101 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));