如何创建列表项随机化器但只显示一次项目?
How can I create a list item randomizer but only show item once?
我想制作一个只显示该项目一次的列表项目随机发生器。我有一个从数组中提取的基本随机化器,但是当我单击按钮时,它只是继续循环遍历每个项目。有没有办法让每个项目只显示一次,然后在完成后停止 and/or 显示类似“list over”的内容?我的js技能很基础...
js随机化器代码:
var techniques = [
"item 1",
"item 2",
"item 3",
"item 4",
"item 5"
]
function newTechnique() {
var randomNumber = Math.floor(Math.random() * (techniques.length));
document.getElementById('techDisplay').innerHTML = techniques[randomNumber];
}
和html
<div id="techDisplay"></div>
<button onclick="newTechnique()">New Technique</button>
我也想知道是否有更好的方法来提取数据,比如使用 xml 之类的?我打算在列表中包含 50 多个项目,这在 js 中可能会变得很麻烦。
让我知道并提前致谢!
先打乱数组。这叫做 'Durstenfeld shuffle'.
要回答您是否应该通过 XML 或其他地方提取数据,我想说考虑也许只制作一个 JSON 文件。在提取 1000 条记录中的 100 条之前,您绝对不会 运行 遇到性能问题,所以如果您处理的数据量如此之小,甚至不必担心性能问题。就个人而言,我通常保留一个单独的文件,其中包含 return 我需要的所有初始数据的函数,或者您可以创建一个 JSON 文件并在打开应用程序后立即导入它。
How to randomize (shuffle) a JavaScript array?
let techniques = [
"item 1",
"item 2",
"item 3",
"item 4",
"item 5"
];
let techniquesRandom = shuffleArray(techniques);
console.log(techniquesRandom);
function shuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
如果我理解你的意思,你的意思是你想随机化数组项:
这是代码
function shuffle(array) {
randoms = [Math.trunc(Math.random() * array.length)];
let length = array.length;
while (randoms.length != length) {
for (let i = 0; i < array.length; i++) {
r = Math.trunc(Math.random() * array.length);
if (!randoms.includes(r)) {
randoms.push(r);
}
}
}
let result = [];
for (let b = 0; b < array.length; b++) {
result.push(array[randoms[b]]);
}
return result;
}
您可以创建一个标志。
var clicked = false;
在newtechnique里面你可以检查clicked是否是false。然后让它成为现实。下次 techdisplay 不会被覆盖。
这是您要查找的功能的代码
const techniques = [
'Currently showing item 1',
'Currently showing item 2',
'Currently showing item 3',
'Currently showing item 4',
'Currently showing item 5',
'Currently showing item 6'
];
let flags = techniques.map(() => false);
function getNotShownNumber() {
let whichItemToShow;
const allAreTrue = flags.every((v) => v === true);
if (!allAreTrue) {
let value = true;
do {
const randomNumber = Math.floor(Math.random() * techniques.length);
const alreadyShown = flags[randomNumber];
if (!alreadyShown) {
flags[randomNumber] = true;
whichItemToShow = randomNumber;
value = false;
}
} while (value);
} else {
whichItemToShow = 'Completed';
}
return whichItemToShow;
}
function newTechnique() {
const number = getNotShownNumber();
const content =
number === 'Completed' ? 'List Over' : techniques[number];
document.getElementById('techDisplay').innerHTML = content;
}
<div id="techDisplay"></div>
<button onclick="newTechnique()">New Technique</button>
我想制作一个只显示该项目一次的列表项目随机发生器。我有一个从数组中提取的基本随机化器,但是当我单击按钮时,它只是继续循环遍历每个项目。有没有办法让每个项目只显示一次,然后在完成后停止 and/or 显示类似“list over”的内容?我的js技能很基础...
js随机化器代码:
var techniques = [
"item 1",
"item 2",
"item 3",
"item 4",
"item 5"
]
function newTechnique() {
var randomNumber = Math.floor(Math.random() * (techniques.length));
document.getElementById('techDisplay').innerHTML = techniques[randomNumber];
}
和html
<div id="techDisplay"></div>
<button onclick="newTechnique()">New Technique</button>
我也想知道是否有更好的方法来提取数据,比如使用 xml 之类的?我打算在列表中包含 50 多个项目,这在 js 中可能会变得很麻烦。 让我知道并提前致谢!
先打乱数组。这叫做 'Durstenfeld shuffle'.
要回答您是否应该通过 XML 或其他地方提取数据,我想说考虑也许只制作一个 JSON 文件。在提取 1000 条记录中的 100 条之前,您绝对不会 运行 遇到性能问题,所以如果您处理的数据量如此之小,甚至不必担心性能问题。就个人而言,我通常保留一个单独的文件,其中包含 return 我需要的所有初始数据的函数,或者您可以创建一个 JSON 文件并在打开应用程序后立即导入它。
How to randomize (shuffle) a JavaScript array?
let techniques = [
"item 1",
"item 2",
"item 3",
"item 4",
"item 5"
];
let techniquesRandom = shuffleArray(techniques);
console.log(techniquesRandom);
function shuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = Math.floor(Math.random() * (i + 1));
[array[i], array[j]] = [array[j], array[i]];
}
return array;
}
如果我理解你的意思,你的意思是你想随机化数组项: 这是代码
function shuffle(array) {
randoms = [Math.trunc(Math.random() * array.length)];
let length = array.length;
while (randoms.length != length) {
for (let i = 0; i < array.length; i++) {
r = Math.trunc(Math.random() * array.length);
if (!randoms.includes(r)) {
randoms.push(r);
}
}
}
let result = [];
for (let b = 0; b < array.length; b++) {
result.push(array[randoms[b]]);
}
return result;
}
您可以创建一个标志。
var clicked = false;
在newtechnique里面你可以检查clicked是否是false。然后让它成为现实。下次 techdisplay 不会被覆盖。
这是您要查找的功能的代码
const techniques = [
'Currently showing item 1',
'Currently showing item 2',
'Currently showing item 3',
'Currently showing item 4',
'Currently showing item 5',
'Currently showing item 6'
];
let flags = techniques.map(() => false);
function getNotShownNumber() {
let whichItemToShow;
const allAreTrue = flags.every((v) => v === true);
if (!allAreTrue) {
let value = true;
do {
const randomNumber = Math.floor(Math.random() * techniques.length);
const alreadyShown = flags[randomNumber];
if (!alreadyShown) {
flags[randomNumber] = true;
whichItemToShow = randomNumber;
value = false;
}
} while (value);
} else {
whichItemToShow = 'Completed';
}
return whichItemToShow;
}
function newTechnique() {
const number = getNotShownNumber();
const content =
number === 'Completed' ? 'List Over' : techniques[number];
document.getElementById('techDisplay').innerHTML = content;
}
<div id="techDisplay"></div>
<button onclick="newTechnique()">New Technique</button>