当前位置: 代码迷 >> JavaScript >> 试图遍历元素为对象的数组
  详细解决方案

试图遍历元素为对象的数组

热度:27   发布时间:2023-06-07 11:44:40.0

我想知道为什么当您在对象中看到星期三= 34时代码会输出false。我认为我可能在更改i变量时遇到问题。

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))

您正在改写的值a与每个迭代for循环。 本质上,您所做的是检查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;
}

当您的代码达到i = 1时,a确实设置为true。 但是之后允许循环继续,所以当我增加到2时,a再次设置为false。

您可以通过确定返回值应为true来从函数中返回来解决此问题:

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

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

另一种可能性是将查找数组优化为具有多个属性的对象,例如

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

  相关解决方案