JavaScript JavaScript Loops, Arrays and Objects Tracking Data Using Objects The Student Record Search Challenge

Kit Howlett
Kit Howlett
5,000 Points

I managed to get everything working but I'm not sure why!?

Hi all,

I have really struggled with this challenge but finally got it to work. Although it is working, I'm a little unsure why?

I understand everything but the condition in my do while loop. I wanted the condition to be "If flag = True or variable search does not = 'quit' loop again. However this does not work as I expected but does work when I use and &&.

Can someone please explain why as I don't understand. Also, when running my code I get an error "Uncaught TypeError: Cannot read property 'toLowerCase' of null on line 17 at student report.js.17" and I can't fix.

Thank you!

function print(message) {
  let outputDiv = document.getElementById('output');
  outputDiv.innerHTML = message;
}

let search;
let name;
let html = '';
let flag = true;

do {
  search = prompt('Search Student Record: Type Name or Type "Quit" to End'); 

  for (let i = 0; i < students.length; i++) {
    name = students[i].name;

    if (name.toLowerCase() === search.toLowerCase()) {
      flag = false;
      html += `<h2>Student: ${students[i].name}</h2>`;
      html += `<p>Track: ${students[i].track}</p>`;
      html += `<p>Achievements: ${students[i].achievements}</p>`;
      html += `<p>Points: ${students[i].points}</p>`;
      print(html);
    }
  }
} while (flag && search.toLowerCase() !== 'quit');

1 Answer

Steven Parker
Steven Parker
194,931 Points

When you test for the opposite of certain conditions, you also combine the tests with the opposite logic.

The condition says the loop should continue running as long as "flag" remains true, and the search term is not "quit". So that means the loop ends if "flag" becomes false (when something matched) OR someone types "quit".

And I'd guess the TypeError only occurs when you cancel the prompt instead of entering "quit", right? That's because the cancel causes "prompt" to return null instead of a string (even an empty one) that you could call "toLower" on. You'll need to handle that case explicitly to make the handling of "cancel" more graceful.