涉及对象和验证的学校Javascript作业无法正常运行

涉及对象和验证的学校Javascript作业无法正常运行,javascript,validation,Javascript,Validation,在过去的两天里,我一直在努力完成这项任务。 作业的目标是创建一个javascript,在用户点击cancel或输入空白文本之前接收学生信息。 每次用户输入信息时,信息都会得到验证。如果信息有效,则会将其保存到学生对象数组中。 这是我的密码: var Student =[]; // Validates Student Courses, loops through making sure they are equal to courseList values. function validateCo

在过去的两天里,我一直在努力完成这项任务。 作业的目标是创建一个javascript,在用户点击cancel或输入空白文本之前接收学生信息。 每次用户输入信息时,信息都会得到验证。如果信息有效,则会将其保存到学生对象数组中。 这是我的密码:

var Student =[];
// Validates Student Courses, loops through making sure they are equal to courseList values.
function validateCourses(courses){
   var valid='';
   var courseList = ['APC100','IPC144','ULI101','IOS110','EAC150','IBC233','OOP244','DBS201','INT222'];
     alert(courses);
       for(var i =0;i<courseList.length;i++){
          var a = courses;
          a.splice();
             if(a[i]!==courseList[i]){
             valid=false;
            }
            else{
               valid=true;
            }
       }
   return valid;
}
function formatingName(name){
   var res ='',cap='';
      res = res + name.charAt(0).toUpperCase();
      cap = res + name.substr(1);
   return cap;
}
// I'm having issues with this validation for the student id. the student id can only be xxx.xxx.xxx
function validateStudentID(sid){
   var validate=0;
   var patt1 = /^\(?([0-9]{3})\)?([.]?)([0-9]{3})?([.]?)([0-9]{2})$/;
   var result = patt1.test(sid);
   return result;
}
var courseSelect=[];
var tag=0;
// this displays what users are in what course depending on what the user enters
function code(coursecode){
      for(var w = 0;w<count;w++){
         for(var t = 0;t<Student[w].courses.length;t++){
             var a = Student[w].courses;
             a.splice();
            if(a[t] == coursecode){
               tag=1;
            }
         }
         if(tag){
             courseSelect.push(Student[w].fname + " " + Student[w].lname + " " + Student[w].id + " " + Student[w].email);
         }
      }

   alert('List students registered in ' + coursecode + ' :\n\n' + courseSelect.join('\n'));
}
// main functions and validation calls
var userInput = "";
var i=0,count=0,j=4,flag=false;
var result='',courses=[];
var Student,validCourses;
do{

   userInput = prompt("Please enter first name, last name,student ID,\n" +
                     "email and courses (speareted by ',').");
 if(userInput != null && userInput !=''){
      result = userInput.split(',');
         for(var i=4;i<result.length && i < 10;i++){
             courses.push(result[i].toUpperCase());
         } 
       // VALIDATION OF STUDENT ID AND STUDENT COURSES */
     while(!flag){
       var valid = validateStudentID(result[2]);
         alert(valid);
          if(valid){
            id = result[2];
            flag=true;
         }
         else {
            alert(Student.id + " is not valid Student ID!" + "\n" + "Please try again.");
            flag=false;
         }
         validCourse = validateCourses(courses);
         if(validCourse){
           flag=true;
         }
        else {
          alert( validCourse + " is not the course provided by the CPD program! \n Please try again");
          flag=false;
        }
     }
        if(flag){
           Student.push({
            fname:formatingName(result[0]),
            lname:formatingName(result[1]),
            id:result[2],
            email:result[3].toLowerCase(),
              courses:courses,
           });

         count++;
         i++;
        }
        else {
           Student = [];
        }
 }
}while(userInput != null && userInput !='');
alert('There are total '+ count + ' students registered');
var coursecode = prompt("Please enter course code: ");
code(coursecode);
var Student=[];
//验证学生课程,通过循环确保它们与课程列表值相等。
功能验证课程(课程){
var有效=“”;
var courseList=['APC100'、'IPC144'、'ULI101'、'IOS110'、'EAC150'、'IBC233'、'OOP244'、'DBS201'、'INT222'];
警觉(课程);

对于(var i=0;i,代码中一些最明显的问题是:

  • 在输入部分之后有一个
    while(!flag)
    循环。该循环不包含任何其他输入请求。因此,如果
    validate*
    方法返回
    false
    ,它将无休止地运行
  • 您的正则表达式
    /^\(?([0-9]{3})?([.]?)([0-9]{3})([.]?)([0-9]{2})$/
    没有做您希望它做的事情。您可以将其简化为
    /^[0-9]{3}\.[0-9]{3}\.[0-9]{3}.[0-9]{3}$/
    因为您只想知道输入参数
    sid
    是否包含三个数字块,每个数字块的长度为3。您不需要任何大括号,也不需要通过
    \(?
    无论如何都是错误的。你也没有通过
    \.
    逃避你的观点,这是错误的,因为它们基本上匹配任何字符。你应该阅读更多关于正则表达式的内容
  • validateCourses
    中的循环看起来有误。为什么要将
    courses
    分配给一个新变量(它没有复制到
    a
    ),然后调用
    splice()
    ?如果
    条件也错误,则您的以下
    ,因为它假定
    a
    courseList
    长度相等,并且课程的位置会匹配。这当然不是您想要的。您应该检查
    课程中的每个课程是否包含在
    courseList
    中,例如:de>var notInCourseList=courses.filter(函数(课程){return(courseList.indexOf(课程)=-1);})
    然后
    return(notInCourseList.length==0);
    。forEach
    循环将是一个简单的选择。您应该阅读一些相关教程
  • 类似地,我也没有看到在
    code()
    中使用
    var a=Student[w]。courses;a.splice();
    的任何好理由。直接查看
    Student[w]。courses

JSFIDLE的工作效率稍高。

谢谢你的详细回复!这是我的网络入门课程,我刚刚掌握了窍门,谢谢你告诉我!我已经根据你的建议修复了代码。我遇到了一个问题,但是在输入无效课程后,再次提示时,我无法租用有效课程。是吗t因为我在main中进行了验证?我不确定您想做什么,我似乎能够在jsfiddle中输入多个课程。根据您更改代码的具体方式,您可能必须在
do{
之后(提示之前)添加一个
标志=false;
,否则上次验证的标志/结果可能会被错误地重用。