我正在编写一个小型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;
});
}