javascript - 设置空数组索引

标签 javascript arrays node.js

我有一个数组,用于保存学生对给定问题的答案。

如果学生给出了答案,它会被插入数组中的当前索引处,如 answers[questionindex] = answer

稍后,我可以读取数组并将条目映射到给定的问题数组

这种情况:

[
"answer",
undefined, // student has not given answer
"answer2",
]

有效。 (遍历数组,简单地输出“没有给出答案”if (answers[questionindex] === undefined)

但当 LAST 答案未定义(1 个或多个)时它不起作用 它们只是不存在(当然)。

我如何将这些字段设置为 undefined(例如,在计时器达到零后),以表明没有给出答案?

现在,平均计算显示 3 个给定(正确)100% 正确,然后 2 个根本不给定

代码

var testResults = {

    addRoom: function(Id, teacher) {  // room pseudoconstructor

        this[Id] = {


            created: moment(),

            runningProblem: false,

            time: 0, // holds the countdown for the current problem

            getTime: function() { // returns the countdown-counter
                return this.time;
            },

            Id: Id,

            teacher: teacher,

            getCurrentSolution: function() {
                return math.eval(this.testProblems[this.getCurrentProblemIndex()].problem);
            },

            getTimeTaken: function() {
                return this.getCurrentProblemTimeLimit() - this.time;
            },

            getCurrentProblemTimeLimit: function() {
                return this.testProblems[this.getCurrentProblemIndex()].timeLimit;
            },

            getCurrentProblemIndex: function() {
                return this.testProblems.length - 1;
            },

            addTestProblem: function(problem, timeLimit) {
                var solution = math.eval(problem);

                this.testProblems.push({problem: problem, timeLimit: timeLimit, solution: solution});
                console.dir(this.testProblems);
            },

            testProblems: [],

            updatePercentages: function(name) {

                function round(num) {
                    return +(Math.round(num + "e+2")  + "e-2");
                }

                console.log('updating percentages');
                console.log('answers length ' + this.students[name].givenAnswers.length);
                var timeSum = 0;
                for(var i = 0; i < this.students[name].givenAnswers.length; i++ ) {
                    timeSum += this.students[name].givenAnswers[i].takenTime;
                }
                var timeAvg = timeSum / this.students[name].givenAnswers.length;

                console.log('timeAvg for ' + name + ' ' + timeAvg);
                this.students[name].avgTime = round(timeAvg);

                var correctSum = 0;
                for(var j = 0; j < this.students[name].givenAnswers.length; j++ ) {
                    if (this.students[name].givenAnswers[j].correct) {
                        correctSum++;
                    }
                }
                var correctAvg = correctSum / this.students[name].givenAnswers.length;


                console.log('correctAvg for ' + name + ' ' + correctAvg);
                this.students[name].avgCorrect = round(correctAvg) * 100;
            },

            addGivenStudentAnswer: function(name, answer, takenTime, index) {

                console.log('adding answer ' + name + ' ' +answer+ ' ' + takenTime);

                var correct = this.getCurrentSolution() == answer;

                if (typeof this.students[name].givenAnswers[index] === 'undefined') {
                    this.students[name].givenAnswers[index] = ({
                        answer: answer,
                        takenTime: takenTime,
                        correct: correct
                    });
                    this.updatePercentages(name);
                    //console.dir(this.students[name].givenAnswers);
                    return true;

                } else {
                    console.log('attempt at double answer. not saved');
                    return false;
                }
            },

            addStudent: function(name) {
                if (!(this.students[name])) {
                    this.students[name] = {
                        studentName : name,
                        avgTime: 0,
                        avgCorrect: 0,
                        givenAnswers: []
                    }
                }
                console.dir(this);
            },
            students: {}
        };

        console.dir(this);

    },

    deleteRoom: function(Id) {
        delete this[Id];
        console.log('room deleted from testResults');
    }
};

//测试后

var name = socket.userName;
        var room = socket.room;
        var created = testResults[room].created;
        var students = testResults[room].students;
        var problems = testResults[room].testProblems;

var test = new tests({
                roomId      : room,
                created     : created,
                teacher     : name,
                students    : students,
                problems    : problems
            });

            test.save(function(err, result) {
                if (err) {console.log(err);}
                else {
                    console.log('test saved to DB');
                    socket.emit('testSaved');
                    // delete from roomList
                    testRooms.deleteRoom(room, name);
                    // delete from resultObject
                    testResults.deleteRoom(room);
                    // answer
                    io.in(room).emit('room Closed');
                }
            });

战后从数据库读取测试的路径

router.get('/showtests/:roomId', function(req, res) {
    if (req.user && req.user.role === 'teacher') {
        tests.findOne({roomId: req.params.roomId}, {}, function(err, result) {
            if (err) {console.log(err);}
            res.render('showSingleTest', {user: req.user, testData: JSON.parse(JSON.stringify(result))});
        })
    } else {
        res.render('customerror', { title: "Error", errMsg1: "error.error", errMsg2: "error.notLoggedIn" });
    }
});

aaaaa和 Jade

h2(data-i18n="markup.studentsAnswers")
each student in testData.students
    .testViewSingleStudentAnswers.col-md-6
        h3 #{student.studentName}

        ol.answers
            each answer in student.givenAnswers
                if (answer)
                    if (answer.correct == true)
                        li.correct
                            span #{answer.answer}
                            | &nbsp;&nbsp;&nbsp;
                            span.floatRight (#{answer.takenTime}s)
                    else
                        li.wrong
                            span #{answer.answer}
                            | &nbsp;&nbsp;&nbsp;
                            span.floatRight (#{answer.takenTime}s)
                else
                    li.noAnswer(data-i18n="markup.noAnswerGiven")
        .testTotals
            | #{student.avgCorrect}
            span(data-i18n="markup.percentCorrect")
            | ,&nbsp;
            | #{student.avgTime}
            span(data-i18n="markup.avgTime")

最佳答案

你可以这样做:

function push_answer(answer){
answer = answer || "undefined"
array_of_answers.push(answer)
}

现在,该值不是未定义的,而是由文字定义的。如果某些答案可能是“未定义”,您可以将其替换为一些 unicode 字符。

祝你有美好的一天!

关于javascript - 设置空数组索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35204362/

相关文章:

arrays - 算法 : Why do I need to reassign an array element to a variable?

javascript - 在没有 TypeScript Transpiler 的情况下使用 Angular 2

node.js - 文件更改后 Docker Compose 容器中的 node_modules 为空

node.js - 沃森视觉识别: How to find location of classified content

javascript - DevExtreme - 尝试从 SQL 将数组分配给 dxList

javascript - 在 Highcharts 中缩放时获取选定的点索引

javascript - map 不是 map

python - 如何为 numpy 数组中的每一行使用不同的索引?

javascript - `space` 分页在浏览器中如何工作?

javascript - r shiny - 条件为 : check item in list 的条件面板