有人能帮我找到下面代码中的逻辑错误吗?当程序运行时,尽管数组中的一个对象满足条件,但程序将所有显示为“无罪”。
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 );
}
}
}
如果运行正确,它应该以红色显示数组中的第二个对象。我不确定迭代是否错误或什么。||而不是&&并且逻辑正确(或者程序给出了正确的答案)。
在我看来,这是一个简单的解决方案,但我花了很长时间,无法实现:/
4条答案
按热度按时间ltqd579y1#
matchSuspect()
应仅测试在suspectObj
中通过的一个主题。q3aa05252#
在true之后需要一个else,在数组的第一个元素之后返回false。
dauxcl2d3#
在
matchSuspect
函数中,当第一次迭代数组的第一个对象时,if
中的条件为false,所以它到达return false;
表达式,整个函数结束,你不能再做其他的迭代,基本上这意味着函数总是返回false。此外,您实际上并没有使用
matchSuspect
函数的参数suspectObj
,您是否打算做其他事情?也许你想做这样的事?
toe950274#
这里的问题是,您的函数忽略了作为参数传入的对象,而是循环遍历整个数组,但在检查第一个人时会立即返回,因此对于作为参数传入的每个人,您总是得到false。
要解决此问题,请尝试删除函数内部的for循环,并且只处理作为参数传入的对象。