【问题标题】:.push onto an array which is in an object.push 到对象中的数组上
【发布时间】:2015-08-30 17:40:11
【问题描述】:

我正在尝试将 .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 个代表。)

如您所见,Mark 在 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: M

userInputFirst: 马

userInputFirst:三月

userInputFirst: 标记

num: 3 nameSearch[A2].subjects[0] 是进阶数学

num: 3 nameSearch[A2].subjects[1] 是纯数学

num: 3 nameSearch[A2].subjects[2] 是微积分

num: 3 nameSearch[AP].subjects[0] 是进阶数学

num: 3 nameSearch[AP].subjects[1] 是纯数学

num: 3 nameSearch[AP].subjects[2] 是微积分

使用 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); ?>;

    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: M

userInputFirst:三月

userInputFirst: 标记

num: 1 nameSearch[A2].subjects[0] 是纯数学

num: 1 nameSearch[AP].subjects[0] 是微积分

AP数组应该有两门科目,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>

我想不通。任何帮助,将不胜感激。谢谢

【问题讨论】:

  • 添加语言标签,JavaScript?
  • 也许你可以提供一个jsfiddle?帮助您解决问题会更容易。
  • 好吧,这个我没用过。这有点棘手。问题是我有 $studentNames 来自的外部 php 文件。
  • 好的,但也许您可以提供该外部文件作为示例

标签: javascript arrays object


【解决方案1】:

你的问题不够清楚。我直接回答你的标题。

object.array.push(value);

【讨论】:

  • 是的,这就是为什么我认为这应该可以将元素添加到对象中的数组中。 nameSearch[students[i].exam].subjects.push(students[i].subject);
  • @user33760 它确实有效。也许您有错误或拼写错误,因此您访问了未定义的对象或数组。试试控制台看看有没有错误。我确实尝试了代码,它确实有效。
【解决方案2】:

查看更新的代码 - 我认为您有错字:

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/

【讨论】:

  • 错字是什么?是学生之前缺少的 var 吗?
  • 对不起,似乎没有错字,但我重组了代码。现在可以用了吗?
  • 不幸的是,由于 .innerHTML 但 .value 有效,它不起作用。 this 通过 id 得到的元素是 input 类型的输入。
  • 好的,但是你可以测试一下是否需要使用val或innerHTML。但其余的工作正常吗?
  • 它工作正常,但未正确填充阵列。我仍然坚持原来的问题。谢谢
【解决方案3】:

我无法使用 .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 是前面提到的类型吗? 谢谢

【讨论】:

  • 我现在看到 .innerHTML 不能与输入元素一起使用,所以这就是我需要使用 .value 的原因。
猜你喜欢
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 2018-10-15
  • 2012-02-14
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2022-09-26
相关资源
最近更新 更多