如何从数组中选择一个随机对象,然后将其删除,以免重复出现?

时间:2019-03-02 01:48:58

标签: javascript arrays

我是Java语言的初学者,必须做一个琐事游戏。我有一系列的问题。我想随机选择一个对象(问题),然后使用它,然后摆脱它,这样当我选择下一个问题时,它就不会再次出现。如何正确执行此操作?到目前为止,我尝试过的是:

class Question
{
constructor(t,oA,oB,oC,oD,ans)
{
  this.title=t;
  this.optionA=oA;
  this.optionB=oB;
  this.optionC=oC;
  this.optionD=oD
  this.answer=ans;
}

  displayQuestion1R1()
 {
      userAnswer=prompt(`${this.title}\nA.${this.optionA}\nB.${this.optionB}\nC.${this.optionC}\nD.${this.optionD}`);
 }

}

Round1Questions.push(new Question("According to scientists, how old, 
approximately, is Earth?", "3 billions years", "100 million years", "4.5 
billion years","2.5 billion years", "4.5 billion years"));

Round1Questions.push(new Question("Who was the first American President?", 
"Benjamin Franklin", "Barack Obama", "George Washington","Thomas Jefferson", 
"George Washington"));

Round1Questions.push(new Question("How many Presidents have there been up to 
this year?(2019)?", "45", "40", "60","46", "45"));

Round1Questions.push(new Question("What is the largest Ocean in the world?", 
"Atlantic Ocean", "Pacific Ocean", "Indian Ocean","Arctic Ocean", "Pacific 
Ocean"));

Round1Questions.push(new Question("Which one of the following is not a 
Marvel super-hero?","Spider-Man","Hulk","Batman", "Iron Man", "Batman"));

let ri=RoundQuestions1[Math.floor(Math.random()*Round1Questions.length)];
let question1R1=Round1Questions.splice(ri, 1);

question1R1.displayQuestion1R1();

当我尝试运行此命令时,它说question1R1.displayQuestion1R1()不是函数。但是,如果我删除了已有的拼接方法,就去做     让question1R1 = RoundQuestions1 [Math.floor(Math.random()* Round1Questions.length)]; 然后执行question1R1.displayQuestion1R1(),然后工作。但是,这不允许我从数组中删除问题。我该怎么做?

2 个答案:

答案 0 :(得分:1)

好的,杰克·巴什福德(Jack Bashford)也很接近,但是splice方法返回一个数组值。

class Question {
  constructor(t, oA, oB, oC, oD, ans) {
    this.title = t;
    this.optionA = oA;
    this.optionB = oB;
    this.optionC = oC;
    this.optionD = oD
    this.answer = ans;
  }

  displayQuestion1R1() {
  //  userAnswer = prompt(`${this.title}\nA.${this.optionA}\nB.${this.optionB}\nC.${this.optionC}\nD.${this.optionD}`);
    console.log( `${this.title}\nA.${this.optionA}\nB.${this.optionB}\nC.${this.optionC}\nD.${this.optionD}` )
  }
}

var Round1Questions = [];

Round1Questions.push(new Question("According to scientists, how old, approximately, is Earth ? ",
  "3 billions years ", "100 million years ", "4.5 billion years ","2.5 billion years ",
  "4.5 billion years ")
);

Round1Questions.push(new Question("Who was the first American President?",
  "Benjamin Franklin", "Barack Obama", "George Washington", "Thomas Jefferson",
  "George Washington")
);

Round1Questions.push(new Question("How many Presidents have there been up to  this year ? (2019) ? ",
  "45", "40", "60","46",
  "45")
);

Round1Questions.push(new Question("What is the largest Ocean in the world?",
  "Atlantic Ocean", "Pacific Ocean", "Indian Ocean", "Arctic Ocean",
  "Pacific Ocean ")
);

Round1Questions.push(new Question("Which one of the following is not a  Marvel super - hero ? ",
  " Spider-Man", "Hulk", "Batman", "Iron Man",
  "Batman ")
);

do {
  let
    PickQuestion_N = Math.floor(Math.random() * Round1Questions.length),
    PickedQuestion = Round1Questions.splice(PickQuestion_N, 1)[0]
  ;

  PickedQuestion.displayQuestion1R1();

} while (Round1Questions.length > 0)

答案 1 :(得分:1)

问题

您的方法由于以下两个原因而无效:

  1. 您使用RoundQuestions1[Math.floor(Math.random()*Round1Questions.length)]来获取Question实例以分配给r1变量。然后,您在Round1Questions.splice(ri, 1)(即not the expected argument type of Array.prototype.splice method)中使用该实例。

  2. Round1Questions.splice(ri, 1)返回一个数组。因此,您的question1R1是一个数组,而不是一个问题。

解决方案

  1. 尝试获取随机Quesiton索引,而不是获取随机问题。
  2. 使用随机索引拼接问题库。
  3. 获取从.splice返回的数组的第一项。了解为什么here

下面的工作代码(请参阅注释以获取说明):

class Question {

  constructor(t, oA, oB, oC, oD, ans){
    this.title = t;
    this.optionA = oA;
    this.optionB = oB;
    this.optionC = oC;
    this.optionD = oD
    this.answer = ans;
  }

  displayQuestion1R1(){
    const { title, optionA, optionB, optionC, optionD } = this;
    const userAnswer = prompt(`
      ${title}
      A. ${optionA}
      B. ${optionB}
      C. ${optionC}
      D. ${optionD}
    `);
  }
  
}

const Round1Questions = [
  new Question(
    "According to scientists, how old, approximately, is Earth?",     "3 billions years",
    "100 million years",
    "4.5 billion years",
    "2.5 billion years",
    "4.5 billion years"
  ),
  new Question(
    "Who was the first American President?",
    "Benjamin Franklin",
    "George Washington",
    "Thomas Jefferson",
    "George Washington"
  ),
  new Question(
    "How many Presidents have there been up to this year (2019)?",
    "45",
    "40",
    "60",
    "46",
    "45"
  ),
  new Question(
    "What is the largest Ocean in the world?",
    "Atlantic Ocean",
    "Pacific Ocean",
    "Indian Ocean",
    "Arctic Ocean",
    "Pacific Ocean"
  ),
  new Question(
    "Which one of the following is not a Marvel super-hero?",
    "Spider-Man",
    "Hulk",
    "Batman",
    "Iron Man",
    "Batman"
  )
];

console.log(`Bank before prompt:`, Round1Questions.map(o => o.title));

// Instead of getting the question, get the index of question
let ri = randomQuestionIndex(Round1Questions);

// Use `ri` index to splice your question array.
// Notice the `[0]` to get the first item in the returned array
let question1R1 = Round1Questions.splice(ri, 1)[0];

// No error now because `question1R1` is a `Question` class instance
question1R1.displayQuestion1R1();

console.log(`Bank after prompt:`, Round1Questions.map(o => o.title));


function randomQuestionIndex(bank){
  return Math.floor(Math.random() * bank.length);
}
/* NOT RELATED TO YOUR CODE */
/* JUST TO MAKE CONSOLE MORE VISIBLE */
.as-console-wrapper { max-height: 100% !important; }

PS

请勿在此处复制任何答案,因为您的教授会立即发现。