试图循环遍历元素为object的数组

trying to loop through an array where the elements are object

本文关键字:object 数组 元素 循环 遍历      更新时间:2023-09-26

我想知道为什么当您可以在周三= 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))

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

当代码达到i=1时,a确实被设置为true。但在此之后,循环被允许继续,所以当i被增加到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));