数组元素仅使用一次
Using an array element only once
我是 JavaScript 的新手,我想从我的数组中获取三个随机元素,它们需要不同。我已经设法获得了三个不同的元素,然后我尝试通过拆分方法只获取一个元素一次。但显然这并不真正有效,可能有很多错误,因为这是我的第一个脚本之一。它有时也会说"未定义"。
http://jsfiddle.net/t4mtpm50/
.HTML:
<span id="tot1"></span>, <span id="tot2"> und </span> und <span id="tot3"></span>
Javascript:
function getNumber() {
random = Math.floor(Math.random() * students.length);
students.splice(random,1);
return random;
}
students = new Array("Paul", "Jan", "Fabian D.", "Fabian K.", "Lennard",
"Robin", "Angelique", "Joyce", "Sarah", "Ajlin",
"Enes", "Leon", "Boran", "Joshua")
getNumber();
tot1 = students[random];
getNumber();
tot2 = students[random];
getNumber();
tot3 = students[random];
document.getElementById('tot1').innerHTML = tot1;
document.getElementById('tot2').innerHTML = tot2;
document.getElementById('tot3').innerHTML = tot3;
.splice()
,随机选择的名称实际上在检索之前被删除,使random
改为引用集合中的下一个名称:
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"
http://jsfiddle.net/6gox6L1t/
是一个更好,更干净,更短的解决方案:
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);
将当前 Students-array 传递给 getStudent()
函数,以避免脚本中包含全局变量。 splice
返回已删除的元素,因此您在那里获得了学生姓名并返回它。
编辑2:我对.length
上的-1
是错误的。 1
是Math.random()
的独家结果,所以你说得对。
http://jsfiddle.net/northkildonan/38rf42f7/1/
编辑:此方法完全避免在脚本中使用全局变量。
试试这个:
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;
请注意长度应该减去 1,因为索引从 0 开始。
http://jsfiddle.net/t4mtpm50/6/
另一种选择是随机排列整个学生列表,然后从随机排列的集合中选择前三个。(此处的随机播放功能改编自 https://stackoverflow.com/a/6274398/567595。
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];
http://jsfiddle.net/4o897kwa/1
- 在函数中添加数组元素的数值
- 访问JSON对象内部的数组元素
- Mongoose-在更新中删除数组元素
- javascript数组元素是否知道其封闭数组
- 将数组元素附加到FormData dos'不适用于Firefox 15
- 第一个字第一个字符第二个字第二个字符,一直到数组结束
- 如何使一个Math.random数组元素比另一个数组元素更有可能被选中
- 删除基于另一个数组的数组元素
- Javascript:如何将数组元素扩展到所有其他元素并创建一个数组
- 删除数组元素并将它们填充在 javascript 中的另一个数组中
- 数组元素仅使用一次
- 从 Web 套接字创建一个数组,并根据 Javascript 中的数组元素递增
- 按相同顺序将数组元素追加到另一个数组
- 通过与另一个数组javascript匹配来覆盖数组元素值
- 在AngularJS中,如何初始化位于另一个数组元素中的数组元素
- 有没有一种方法来样式单独的数组元素在js
- 选择如果数组元素重复两次——Javascript
- Javascript:将数组元素添加到另一个数组
- 创建一个子数组数组,其中包含元素的值及其在 JavaScript 中重复的次数
- 仅将键:值对附加到我的数组元素一次