javascript 如何识别和纠正逻辑错误?

nbnkbykc  于 2023-02-07  发布在  Java
关注(0)|答案(4)|浏览(106)

有人能帮我找到下面代码中的逻辑错误吗?当程序运行时,尽管数组中的一个对象满足条件,但程序将所有显示为“无罪”。

var suspectsArray = [
{ 
    "name": "BRIDGET ASHELY",
    "glasses": "very thick",
    "accessory": "metal briefcase",
    "eyes": "pale",
    "height": 155,
    "age": 63
},
{ 
    "name": "LIANNE NIEMELA",
    "glasses": "blue",
    "accessory": "plastic box",
    "eyes": "brown",
    "height": 150,
    "age": 47
},
{ 
    "name": "JAUNITA FORSLIN",
    "glasses": "dark brown",
    "accessory": "laptop bag",
    "eyes": "grey",
    "height": 182,
    "age": 58
},
{ 
    "name": "JULIANA DEAUVILLE",
    "glasses": "red",
    "accessory": "glass bottle",
    "eyes": "green",
    "height": 175,
    "age": 34
},
{ 
    "name": "LINETTE DORCEY",
    "glasses": "light tan",
    "accessory": "big black envelope",
    "eyes": "blue",
    "height": 178,
    "age": 43
}
];

var myFont;
var backgroundImg;

function preload() {
 myFont = loadFont('SpecialElite.ttf');
 backgroundImg = loadImage("Background.png");
}

function setup()
{
createCanvas(640,480);
textFont(myFont);
}

function matchSuspect(suspectObj){

    for (var k = 0; k < suspectsArray.length; k++)
    {
        if(
        suspectsArray[k].glasses == "blue" &&
        suspectsArray[k].accessory == "plastic box" &&
        suspectsArray[k].eyes == "brown" &&
        suspectsArray[k].height > 141 &&
        suspectsArray[k].age < 49
    ){
        return true;
    }

        return false;
    }
    }
function draw()
{

  image(backgroundImg, 0, 0);

  for(let i = 0 ; i < suspectsArray.length; i++){
    if(matchSuspect(suspectsArray[i]) == true){
      fill(255,0,0);
      text(suspectsArray[i].name + " is guilty!", 60, 60 + i * 20);
    }else{
      fill(0,155,0);
      text(suspectsArray[i].name + " is not guilty", 60, 60 + i * 20 );
    }
  }
}

如果运行正确,它应该以红色显示数组中的第二个对象。我不确定迭代是否错误或什么。||而不是&&并且逻辑正确(或者程序给出了正确的答案)。
在我看来,这是一个简单的解决方案,但我花了很长时间,无法实现:/

ltqd579y

ltqd579y1#

matchSuspect()应仅测试在suspectObj中通过的一个主题。

function matchSuspect(suspectObj) {
  return suspectObj.glasses == "blue" &&
    suspectObj.accessory == "plastic box" &&
    suspectObj.eyes == "brown" &&
    suspectObj.height > 141 &&
    suspectObj.age < 49;
}
q3aa0525

q3aa05252#

  • matchSuspect -将suspect和suspect传递给它,以获得更好的代码质量。
  • 画出嫌疑犯并匹配嫌疑犯
  • 使用===不使用==
  • 修改一下你的造型,这样更容易看出来
  • 循环两次,一次在matchSuspect中,一次在draw中,从其中一个中删除循环。

在true之后需要一个else,在数组的第一个元素之后返回false。

dauxcl2d

dauxcl2d3#

matchSuspect函数中,当第一次迭代数组的第一个对象时,if中的条件为false,所以它到达return false;表达式,整个函数结束,你不能再做其他的迭代,基本上这意味着函数总是返回false。
此外,您实际上并没有使用matchSuspect函数的参数suspectObj,您是否打算做其他事情?
也许你想做这样的事?

function matchSuspect(suspectObj) {
    if (suspectObj.glasses == "blue" &&
        suspectObj.accessory == "plastic box" &&
        suspectObj.eyes == "brown" &&
        suspectObj.height > 141 &&
        suspectObj.age < 49
    ) {
        return true;
    }
    
    return false;
}

function draw() {
    image(backgroundImg, 0, 0);

    for(let i = 0 ; i < suspectsArray.length; i++) {
        if (matchSuspect(suspectsArray[i]) == true) {
            fill(255,0,0);
            text(suspectsArray[i].name + " is guilty!", 60, 60 + i * 20);
        } else {
            fill(0,155,0);
            text(suspectsArray[i].name + " is not guilty", 60, 60 + i * 20 );
        }
    }
}
toe95027

toe950274#

这里的问题是,您的函数忽略了作为参数传入的对象,而是循环遍历整个数组,但在检查第一个人时会立即返回,因此对于作为参数传入的每个人,您总是得到false。
要解决此问题,请尝试删除函数内部的for循环,并且只处理作为参数传入的对象。

function matchSuspect(suspectObj){

    if(
    suspectObj.glasses == "blue" &&
    suspectObj.accessory == "plastic box" &&
    suspectObj.eyes == "brown" &&
    suspectObj.height > 141 &&
    suspectObj.age < 49
    ){
      return true;
    }

    return false;
}

相关问题