Как использовать логическое значение для проверки правильности выполнения условия в цикле for? - PullRequest
0 голосов
/ 07 июня 2019

Я хочу, чтобы появилось сообщение с просьбой ввести имя студента. Javascript просматривает записи ученика, которые находятся в отдельном файле JS, а затем выводит информацию ученика в переменную сообщения.

Вот соответствующий код JavaScript:

var students=[
    {
        name:'Chris',
        track:'IOS',
        achievements:'100',
        points:'1000'
    },
    {
        name:'John',
        track:'Web Design',
        achievements:'90',
        points:'1000'
    },
    {
        name:'Brent',
        track:'Front-End',
        achievements:'70',
        points:'1000'
    },
    {
        name:'Josh',
        track:'Full-Stack',
        achievements:80,
        points:'1000'
    },
    {
        name:'Nick',
        track:'AI',
        achievements:'60',
        points:'1000'
    }
];

function print(message) {
    document.write(message);
}
var message="";
var flag=false;
var search=prompt("Type name of student. Type 'quit' to exit.");
while (search!=="quit") {
    for (var i=0; i<students.length; i+=1) {
    var studentName=students[i].name;
        if (studentName===search) {
            flag=true;
            break;
        } 
    }
    if (flag) {
        message+="<h1>"+studentName+"</h1>";
        message+="<p>"+students[i].track+"</p>";
        message+="<p>"+students[i].achievements+"</p>";
        message+="<p>"+students[i].points+"</p>";
    } else {
        alert("That student does not exist. Try again");
        search=prompt("Type name of student");
    }
}
print(message);

Я понимаю, что я близок, однако моя единственная проблема в том, что любая переменная, к которой я пытаюсь получить доступ из цикла for, будет локальной только для этого цикла. Итак, как будут работать мои условия if и else, если я не могу получить доступ к локальным переменным цикла в моих условных выражениях? Я просто хочу, чтобы он нашел совпадение, как только это произойдет, остановит цикл for и затем перейдет к использованию этого конкретного индекса элемента.

Ответы [ 2 ]

0 голосов
/ 07 июня 2019

Как насчет этого?

var students = [...];

function format(student) {
  return (
    '<h1>' + student.name + '</h1>' +
    '<p>' + student.track + '</p>' +
    '<p>' + student.achievements + '</p>' +
    '<p>' + student.points + '</p>'
  );
}

function lookup(name) {
  return students.find(function(student) {
    return name === student.name
  });
}

function print(message) {
  document.write(message);
}

function searchPrompt() {
  return prompt("Type name of student. Type 'quit' to exit.");
}

function run() {
  var search = searchPrompt();

  if (search === 'quit') {
    return;
  }

  var student = lookup(search);

  if (student) {
    print(format(student));
  } else {
    alert("That student does not exist. Try again");
    run();
  }
}

run();
0 голосов
/ 07 июня 2019

Я бы отбросил цикл и использовал бы find().Это вернет найденный объект ученика или вернет undefined, если ученик не был найден.

let student = students.find(s => s.name == search)

Затем мы можем поместить код в рекурсивную функцию, которая будет продолжать вызывать себя, пока пользователь не найдетстудент или поступает quit:

var students = [{
    name: 'Chris',
    track: 'IOS',
    achievements: '100',
    points: '1000'
  },
  {
    name: 'John',
    track: 'Web Design',
    achievements: '90',
    points: '1000'
  },
  {
    name: 'Brent',
    track: 'Front-End',
    achievements: '70',
    points: '1000'
  },
  {
    name: 'Josh',
    track: 'Full-Stack',
    achievements: 80,
    points: '1000'
  },
  {
    name: 'Nick',
    track: 'AI',
    achievements: '60',
    points: '1000'
  }
];

function findStudent() {
  let search = prompt("Type name of student. Type 'quit' to exit.");
  // Exit the function if the user types 'quit'
  if (search == 'quit') return
  // Find the student
  let student = students.find(s => s.name == search)
  let message = "";
  // If the student was found, write to the document
  if (student) {
    message += "<h1>" + student.name + "</h1>";
    message += "<p>Track: " + student.track + "</p>";
    message += "<p>Achievements: " + student.achievements + "</p>";
    message += "<p>Points: " + student.points + "</p>";
    document.body.innerHTML = message
  }
  // The student was not found
  // Let the user know and call the function again
  else {
    alert("That student does not exist. Try again");
    findStudent()
  }
}

findStudent()
...