Javascript 仅使用数组元素一次

Javascript 仅使用数组元素一次,javascript,jquery,html,arrays,random,Javascript,Jquery,Html,Arrays,Random,我是JavaScript新手,我想从数组中获得三个随机元素,它们需要不同。我已经设法获得了三个不同的元素,然后我尝试通过split方法只获取一个元素一次。但很明显这并没有真正起作用,可能有很多错误,因为这是我的第一个脚本之一。它有时也会说“未定义” HTML: 试试这个: students = new Array("Paul", "Jan", "Fabian D.", "Fabian K.", "Lennard", "Robin", "Angelique"

我是JavaScript新手,我想从数组中获得三个随机元素,它们需要不同。我已经设法获得了三个不同的元素,然后我尝试通过split方法只获取一个元素一次。但很明显这并没有真正起作用,可能有很多错误,因为这是我的第一个脚本之一。它有时也会说“未定义”

HTML:

试试这个:

 students = new Array("Paul", "Jan", "Fabian D.", "Fabian K.", "Lennard",                   "Robin", "Angelique", "Joyce", "Sarah", "Ajlin",
"Enes", "Leon", "Boran", "Joshua")    


var arr = []
while(arr.length < 3){
  var randomnumber=Math.ceil(Math.random()*students.length-1)
  var found=false;
  for(var i=0;i<arr.length;i++){
    if(arr[i]==randomnumber){found=true;break}
  }
  if(!found)arr[arr.length]=randomnumber;
}
console.log(arr.valueOf());

tot1 = students[arr[0]];

tot2 = students[arr[1]];

tot3 = students[arr[2]];

document.getElementById('tot1').innerHTML = tot1;
document.getElementById('tot2').innerHTML = tot2;
document.getElementById('tot3').innerHTML = tot3;
students=新数组(“Paul”、“Jan”、“Fabian D.”、“Fabian K.”、“Lennard”、“Robin”、“Angelique”、“Joyce”、“Sarah”、“Ajlin”,
“埃内斯”、“利昂”、“波兰”、“约书亚”)
var arr=[]
而(arr.length<3){
var randomnumber=Math.ceil(Math.random()*students.length-1)
var=false;
对于(var i=0;i

,通过使用
.splice()
,随机选择的名称实际上在检索之前被删除,从而使
随机
引用集合中的下一个名称:

var students = [ "Paul", "Jan", "Fabian D." ];
var random = 1;

console.log(students[random]); // "Jan"

students.splice(random, 1);

console.log(students);         // [ "Paul", "Fabian D." ]
console.log(students[random]); // "Fabian D."
random
尝试引用最后一个元素时,会出现“它有时说‘未定义’”:

var students = [ "Paul", "Jan", "Fabian D." ];
var random = 2;

console.log(students[random]); // "Fabian D."

students.splice(random, 1);

console.log(students);         // [ "Paul", "Jan" ]
console.log(students[random]); // undefined, random is now out-of-bounds at 2

您可以使用
.splice()
的返回值,它是已删除元素的集合,重新定义
getNumber()
以返回元素而不是索引:

function getStudent() {
    var random = Math.floor(Math.random() * students.length);
    return students.splice(random, 1)[0]; // return the 1st and only removed element
}

var tot1 = getStudent(); // "Fabian D."
var tot2 = getStudent(); // "Enes"
var tot3 = getStudent(); // "Joyce"

我认为这将是一个更好、更干净、更短的解决方案:

function getStudent(students) {
    var random = Math.floor(Math.random() * (students.length));
    var my_student = students.splice(random,1);
    return my_student;
}

var students = new Array("Paul", "Jan", "Fabian D.", "Fabian K.", "Lennard", 
                            "Robin", "Angelique", "Joyce", "Sarah", "Ajlin",
                         "Enes", "Leon", "Boran", "Joshua");


document.getElementById('tot1').innerHTML = getStudent(students);
document.getElementById('tot2').innerHTML = getStudent(students);
document.getElementById('tot3').innerHTML = getStudent(students);

将当前学生数组传递给
getStudent()
函数,以避免脚本中出现全局变量。
splice
返回已删除的元素,因此您在其中获得了学生姓名并将其返回

edit2:我对
上的
-1
的理解是错误的。length
1
Math.random()
的独家结果,所以你的理解是对的


编辑:此方法完全避免在脚本中使用全局变量。

另一个选项是对整个学生列表进行洗牌,然后从洗牌集中选择前三个。(此处的洗牌函数改编自。)


tot1=students[random]当该语句命中时,random是未定义的。random是getNumber函数中的一个局部变量,但一旦该函数退出,该局部变量将不再可访问。应为tot1=students[getNumber()];或var RandomNumber=getNumber();tot1=students[RandomNumber];@frenchie没有
var
或类似的关键字将
random
声明为本地,它将作为全局泄漏。通常您访问
return
变量,如下所示:
var my\u return\u var=getNumber()
就像@JonathanLonowski提到的那样,您的变量的行为就像全局变量,这很容易在更大的代码中导致问题。如果我的解决方案对您不起作用,请让我知道。欢迎来到StackOverflow!请看,其中的共识是“不,他们不应该”。该代码甚至不会多次尝试阻止名称出现。@JukkaK.Korpela好的,对不起,修复了我的答案。非常感谢,这似乎有效。您可以告诉我这到底是如何工作的吗?我真的不明白:)@SimonMathewson该算法非常简单,我创建了一个空数组,并将长度设置为3(计算您需要多少不同的随机数),创建了一个生成随机数的循环,当生成一个数时,它迭代数组以检查之前是否创建了类似的数,如果是,它将生成新的数,依此类推,直到没有找到类似的数,最后使用数组元素引用原始数组。如果我的答案正确,请在e、 您同时也几乎得到了相同的想法:-)也谢谢!似乎是一个更好的解决方案。非常感谢!这似乎是使用
Math.random()*(students.length-1)可能的最干净、最简单的方法
意味着数组中的最后一项永远无法拾取。@Phylogenesis噢,是的,是的,谢谢!1在
Math.random()
中是唯一的,请阅读。所以这不是他“未定义”的原因错误。他出现
未定义的
错误的原因是因为他返回了一个表示他从数组中删除的元素的索引。@ProllyGeek它不会。
function getStudent() {
    var random = Math.floor(Math.random() * students.length);
    return students.splice(random, 1)[0]; // return the 1st and only removed element
}

var tot1 = getStudent(); // "Fabian D."
var tot2 = getStudent(); // "Enes"
var tot3 = getStudent(); // "Joyce"
function getStudent(students) {
    var random = Math.floor(Math.random() * (students.length));
    var my_student = students.splice(random,1);
    return my_student;
}

var students = new Array("Paul", "Jan", "Fabian D.", "Fabian K.", "Lennard", 
                            "Robin", "Angelique", "Joyce", "Sarah", "Ajlin",
                         "Enes", "Leon", "Boran", "Joshua");


document.getElementById('tot1').innerHTML = getStudent(students);
document.getElementById('tot2').innerHTML = getStudent(students);
document.getElementById('tot3').innerHTML = getStudent(students);
function shuffle(array) {
    var i, temp, j;
    for (i = array.length; i; i--) {
        j = Math.floor(Math.random() * i);
        temp = array[i - 1];
        array[i - 1] = array[j];
        array[j] = temp;
    }
}
students = ["Paul", "Jan", "Fabian D.", "Fabian K.", "Lennard", 
                            "Robin", "Angelique", "Joyce", "Sarah", "Ajlin",
                            "Enes", "Leon", "Boran", "Joshua"];
shuffle(students);
document.getElementById('tot1').innerHTML = students[0];
document.getElementById('tot2').innerHTML = students[1];
document.getElementById('tot3').innerHTML = students[2];