范围:在通过函数传递包含对象的同时操纵全局变量?

时间:2017-05-02 09:14:55

标签: javascript arrays scope

我正在编写一个小型Node.js服务器来处理调查。 调查存储在全局数组中的服务器上。

当用户回答问题时,客户端会将surveyID,questionID和答案发送给服务器。然后在服务器上,我使用Array.find()来确定数组中的正确调查,以及调查中的正确问题。 现在我添加对象的答案。到现在为止还挺好。的工作原理。

但是如果我想在另一个函数中进行操作,我不能简单地将找到的调查对象传递给它,因为它不再是相同的,而是一个新的,并在子内部操纵它函数不会改变全局调查对象 - 是吗?

所以我目前所做的是将ID传递给子函数并再次使用Array.find。这样就行了。

我的问题是:这是正确的方法吗?或者还有另一种方式吗?

示例代码:

var surveys = [{
    id: 117171,
    flag_anonym: true,
    flag_live: true,
    status: "open",
    active_question: 0,
    questions: [
    {
        id: 117192,
        title: "Wie heißt die Hauptstadt von Deutschland?",
        typ: "singlechoice",
        answered_by_socket: [ ],
        answered_by_user: [ ],
        answers: [
            {
                id: 117188,
                title: "Mainz",
                votes_anonym: 11
            },
            {
                id: 117189,
                title: "Wiesbaden",
                votes_anonym: 0
            },
            {
                id: 117190,
                title: "Berlin",
                votes_anonym: 1
            },
            {
                id: 117191,
                title: "München",
                votes_anonym: 0
            }
        ]
    }
]}];

function updateSurvey(data) {
    var survey = surveys.find(function (s) {
        return s.id === data.survey_id;
    });
    if (typeof survey !== "undefined") {
        if(survey.flag_live) {
            // live survey, question can only be answered if active
            if (survey.active_question < survey.questions.length) {
                var question = survey.questions[survey.active_question];
                if (data.question_id === question.id) {
                    answerQuestion(data);
                }
            }
        }else {
            // question can always be answered
            answerQuestion(data);
        }
    }
}

function answerQuestion(data){
    // I have to do Array.find again
    var survey = surveys.find(function (s) {
        return s.id === data.survey_id;
    });
    var question = survey.questions.find(function (s) {
        return s.id === data.question_id;
    });
    question.answered_by_socket.push(data.socket_id);
    if (data.user_id) {
        question.answered_by_user.push(data.user_id);
    }
    // update answers
    question.answers = question.answers.map(function (a) {
        for (var i = 0; i < data.answers.length; i++) {
            var answer = data.answers[i];
            if (a.id === answer.id) {
                if (answer.checked) {
                    a.votes_anonym++;
                }
                return a;
            }
        }
        return a;
    });
}

0 个答案:

没有答案