2015-08-29 2 views
0

Я пытаюсь .push() на массив, который находится в объекте. Как я могу это сделать?.push на массив, который находится в объекте

У меня есть объект, называемый students {}. Каждая строка содержит первое имя, фамилию, тип экзамена и предмет для этого типа экзамена. Я пытаюсь создать массив (studentSubjectsByName) всех предметов для этого ученика для этого типа экзамена. Затем я хочу поместить этот массив объектов в другой объект с именем nameSearch {}.

Информационный в БД выглядит так,

В таблице базы данных выглядит следующим образом

> id exam subject    year session  result first last 
> 
> 186 A2 Further Mathematics 2015 January  D Mark Murphy 
> 
> 185 A2 Pure Mathematics 2015 January  A Mark Murphy 
> 
> 183 AP Calculus   2015 NULL   2 Mark Murphy 
> 
> 184 AP Chemistry   2015 NULL   5 David Smith 
> 
> 182 AP Calculus   2015 NULL   5 David Smith 

(я не могу отправить изображение, как у меня нет 10 повторений.)

Как вы можете видеть, у Марка есть два предмета в A2.

Следующее подталкивает объекты к массиву и приводит к тому, что три объекта являются элементами массивов. Для каждого предмета есть массив, но у каждого из них есть три предмета. Вместо массива AP, имеющего два и массив A2, имеющих только один, как и должно быть. Это происходит потому, что var studentSubjectsByName = []; находится вне цикла for.

function checkStudent(){ 
    var subjectSearch = {}; 
    var nameSearch = {}; 
    var userInputFirst = document.getElementById('firstname').value; 
    var userInputLast = document.getElementById('lastname').value; 
    var students = <?php echo json_encode($studentNames, JSON_PRETTY_PRINT); ?>; 
    var studentSubjectsByName = []; 
    for(var i = 0; i < students.length; i++){ 

     console.log("userInputFirst: " + userInputFirst); 
     if(userInputFirst == students[i].first && userInputLast == students[i].last){ 
      //console.log("First name: " + students[i].first + " Last name: " + students[i].last + " Exam: " + students[i].exam + " Subject: " + students[i].subject); 

      nameSearch[students[i].exam] = {first:students[i].first, last:students[i].last, subjects:studentSubjectsByName};//this clears the array 

      nameSearch[students[i].exam].subjects.push(students[i].subject); 
      //console.log(studentSubjectsByName); 
      //console.log(nameSearch); 
     } 
    } 

    for(var item in nameSearch){ 
     var num = nameSearch[item].subjects.length; 
     for(var i=0; i<num; i++){ 
      console.log("num: " + num + " nameSearch[" + item + "].subjects[" + i + "] is " + nameSearch[item].subjects[i]); 
     } 
    } 
} 

Выход

userInputFirst: М

userInputFirst: Ма

userInputFirst: Mar

userInputFirst: Марк

Num: 3 адресного поиска [А2]. предметы [0] - дополнительная математика

Num: 3 [A2 адресного поиска] .subjects [1] Чистая математика

Num: 3 [A2 адресного поиска] .subjects [2] Исчисление

NUM: 3 [AP адресного поиска] .subjects [0] Далее Математика

Num: 3 [AP адресного поиска] .subjects [1] Чистая математика

Num: 3 [AP адресного поиска] .subjects [2] исчисление

С вар studentSubjectsByName знак равно внутри цикла for массив постоянно очищается.

function checkStudent(){ 
    var subjectSearch = {}; 
    var nameSearch = {}; 
    var userInputFirst = document.getElementById('firstname').value; 
    var userInputLast = document.getElementById('lastname').value; 
    var students = <?php echo json_encode($studentNames, JSON_PRETTY_PRINT); ?>; 

    for(var i = 0; i < students.length; i++){ 
     var studentSubjectsByName = []; 
     console.log("userInputFirst: " + userInputFirst); 
     if(userInputFirst == students[i].first && userInputLast == students[i].last){ 
      //console.log("First name: " + students[i].first + " Last name: " + students[i].last + " Exam: " + students[i].exam + " Subject: " + students[i].subject); 

      nameSearch[students[i].exam] = {first:students[i].first, last:students[i].last, subjects:studentSubjectsByName};//this clears the array 

      nameSearch[students[i].exam].subjects.push(students[i].subject); 
      //console.log(studentSubjectsByName); 
      //console.log(nameSearch); 
     } 
    } 

    for(var item in nameSearch){ 
     var num = nameSearch[item].subjects.length; 
     for(var i=0; i<num; i++){ 
      console.log("num: " + num + " nameSearch[" + item + "].subjects[" + i + "] is " + nameSearch[item].subjects[i]); 
     } 
    } 
} 

Выход есть.

userInputFirst: М

userInputFirst: Mar

userInputFirst: Марк

Num: 1 [A2 адресного поиска] .subjects [0] Чисто математический

Num: 1 адресного поиска [А.П. ].субъекты [0] - это исчисление

В массиве AP должно быть два объекта и один объект Calculus в массиве A2.

HTML, есть

<td class="left"> 
    First name: <input type="input" name="last" id="firstname" onkeyup="checkStudent()" placeholder="first name"> 
</td> 
<td class="left"> 
    Last name: <input type="input" name="first" id="lastname" onkeyup="checkStudent()" placeholder="last name"> 
</td> 

Я не могу понять это. Любая помощь будет оценена по достоинству. Спасибо

+0

Добавить тег для языка, JavaScript? –

+0

Может быть, вы можете предоставить jsfiddle? Было бы легче помочь вам с вашей проблемой. – lightstalker89

+0

Хорошо, я не использовал это раньше. Это немного сложно. Проблема в том, что у меня есть внешний php-файл, откуда приходит $ studentNames. –

ответ

0

Ваш вопрос недостаточно ясен. Я отвечаю прямо на ваш титул.

object.array.push(value); 
+0

Да, и поэтому я думаю, что это должно сработать над добавлением элемента в массив, который находится в объекте , [Студенты адресного поиска [I] .exam] .subjects.push (студенты [я] .subject); –

+0

@ пользователь33760 это действительно работа. Возможно, у вас есть ошибка или опечатка, поэтому вы получили доступ к неопределенному объекту или массиву. Попробуйте консоль, чтобы увидеть, есть ли какая-либо ошибка. Я попробовал код, и он действительно сработал. –

0

Посмотрите на обновленный код - я думаю, что у вас есть опечатка:

function checkStudent(){ 
    var nameSearch = {}; 
    var subjectSearch = {}; 
    var userInputFirst = document.getElementById('firstname').innerHTML; 
    var userInputLast = document.getElementById('lastname').innerHTML; 
    var students = [{ first: "first1", last: "last1", exam: "exam1", subject: "subject1"}, { first: "first2", last: "last2", exam: "exam2", subject: "subject2"}]; 
    for(var i = 0; i < students.length; i++){ 
     var studentSubjectsByName = []; 
     if(userInputFirst == students[i].first && userInputLast == students[i].last){ 

      console.log("First name: " + students[i].first + " Last name: " + students[i].last + " Exam: " + students[i].exam + " Subject: " + students[i].subject); 

      studentSubjectsByName.push(students[i].subject); 

      nameSearch[students[i].exam] = {first:students[i].first, last:students[i].last, subjects:studentSubjectsByName}; 

      nameSearch[students[i].exam].subjects.push(students[i].subject); 
      console.log(studentSubjectsByName); 
      console.log(nameSearch); 
     } 
    } 
} 

Вот скрипка: https://jsfiddle.net/77er1a3r/

+0

Что такое опечатка? Это недостающий var перед учениками? –

+0

Извините, что не было опечатки, но я изменил код. Он работает сейчас? – lightstalker89

+0

К сожалению, это не сработает из-за работы .innerHTML, но .value работает. Элемент, который получает по id, представляет собой вход ввода типа. –

0

Я не могу получить эту работу, используя .innerHTML

var userInputFirst = document.getElementById('firstname').innerHTML; 
var userInputLast = document.getElementById('lastname').innerHTML; 
console.log("first: " + userInputFirst + " last: " + userInputLast); 

Но он действительно работает, будь то в основном, с .value

var userInputFirst = document.getElementById('firstname').value; 
var userInputLast = document.getElementById('lastname').value; 
console.log("first: " + userInputFirst + " last: " + userInputLast); 

HTML, является,

Имя: Фамилия:

ли мое использование .value вместо .innerHTML типа упоминалось ранее? Thanks

+0

Теперь я вижу, что .innerHTML не будет работать с элементом ввода, поэтому мне нужно использовать .value. –

Смежные вопросы