【问题标题】:Check content of multiple variables using for-loop使用for循环检查多个变量的内容
【发布时间】:2019-06-16 06:00:18
【问题描述】:

我有多个包含一个问题和两个答案选项的数组变量。它们用于改变问题的调查。

var q1 = ["question","option1","option2"];
var q2 = ["question","option1","option2"];
...
var q8 = ["","",""];
var q9 = ["","",""];

我希望能够自动更改用户通过的问题数量。我这样做的方法是添加一个for循环来检查数组是否为空,如果数组为空,它将完成对之前问题的调查。

这是我尝试过的:

for (i = 1; i < 9; i++) {
    if ("q"+i = ["","",""]) {
        console.log("Stopped at "+i);
        finishSurvey():
        i = 9; //Stop for-loop
    } else {
        console.log("Error");
    }
}

这里的问题是if-argument的左边,我也试过这个:

if (qi = ["","",""]) {

但是,它将选择第一个可用选项 (1)。使用 == 或 === 会使 qi 未定义。如何使用 for 循环检查所有数组变量是否为空?每次循环运行时,我都需要一种方法来增加第二个数字,然后将其作为变量读取。

我可以用很长的 if-sentence 来做到这一点,但如果我有更多问题,那就太痛苦了。

【问题讨论】:

  • "我有多个变量" - 你的问题。永远不要使用带有枚举名称的变量 - 使用数组来代替,例如 var q = [q1, q2, q3, …]; 然后您可以轻松地迭代这个问题数组。

标签: javascript for-loop variables arguments var


【解决方案1】:

您可以检查数组的内容以查看它是否包含空字符串,为此我使用join 将所有空字符串附加并使其合二为一,然后与空字符串引用进行比较。

一旦我们发现一个空字符串出现,我们停止并退出循环并打印我们遇到空数组的第 i 个问题。假设您以有序的方式传递问题数组,使得具有空字符串的问题数组位于末尾。

var q1 = ["question","option1","option2"];
var q2 = ["question","option1","option2"];
var q3 = ["","",""];
var q4 = ["","",""];
var questions = [q1, q2, q3, q4];

function checkQuestions(questions){
 for(let i =0; i<questions.length;i++){
   if(questions[i].join("") === ""){
      console.log("stopped at question "+(i+1));
      break;
    }
  } 
}
checkQuestions(questions);

【讨论】:

  • 好的,但是变量还是一一提到。这是唯一的方法吗?
  • @Marcus 你可以传递任意数量的变量,我从arguments 数组中获取它们。您还可以将变量数组传递给函数并使用扩展运算符。 checkQuestions(...[q1, q2, q3, q4]);.
  • 不,不要为此使用eval
  • 好多了,虽然我看不出有任何理由在这里使用扩展语法和arguments 对象。要么将q 数组作为单个参数传递,要么使用rest 语法并调用checkQuestions(q1, q2, q3, q4)。感谢您的编辑!
【解决方案2】:

你不能真正“动态地”循环这样的变量。我会尝试将所有问题放在一个数组中,并将每个问题及其答案放在一个对象中:

<div id="root"></div>


var questions = [
  {
    question: "question 1",
    answers: [
      "answer 1",
      "answer 2"
    ]
  },
  {
    question: "question 2",
    answers: [
      "answer 1",
      "answer 2"
    ]
  },
   {
    question: "question 3",
    answers: [
      "answer 1",
      "answer 2"
    ]
  }
];


function renderQuestions(questionsArr) {
   var html = '';
   var container = document.getElementById("#root");

   quesaionsArr.forEach(function(questionObj) {
     if (questionObj.question && questionObj.answers.length) {
       // do your work to create each question and answer 
     }
   }); 

   // append final html to parent
   container.appendChild(html)
}

【讨论】:

  • 这种数组的使用对我来说太复杂了。您的代码也给出了语法错误。
  • “你不能真正‘动态地’循环这样的变量”——你 s̶h̶o̶u̶l̶d̶̶n̶e̶v̶e̶r 总是可以使用 eval() 来实现这种功能。
  • 我不知道你是如何产生问题的,但我会用一个数组来做。我添加了更多代码供您使用...
猜你喜欢
  • 2019-09-25
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多