我想讓這四個變數中的每一個始終采用從陣列中獲取的不同“名稱”值。我想撰寫它,以便它檢查變數是否等于任何其他變數,如果是,則將其重新隨機化以使其不同。到目前為止,我有這個:
const arr = [{name:"a"},{name:"b"},{name:"c"},{name:"d"},{name:"e"},{name:"f"}]
function myFunction()
{
let var1 = arr[Math.floor(Math.random() * arr.length)].name;
let var2 = arr[Math.floor(Math.random() * arr.length)].name;
let var3 = arr[Math.floor(Math.random() * arr.length)].name;
let var4 = arr[Math.floor(Math.random() * arr.length)].name;
while (var1 == var2 || var1 == var3 || var1 == var4)
{
var1 = arr[Math.floor(Math.random() * arr.length)].name;
}
while (var2 == var1 || var2 == var3 || var2 == var4)
{
var2 = arr[Math.floor(Math.random() * arr.length)].name;
}
while (var3 == var2 || var3 == var1 || var3 == var4)
{
var3 = arr[Math.floor(Math.random() * arr.length)].name;
}
while (var4 == var2 || var4 == var3 || var4 == var1)
{
var4 = arr[Math.floor(Math.random() * arr.length)].name;
}
}
但這不僅不起作用,我還遇到了變數仍然可以相等的問題,因為雖然第一個“while”將它們隨機化為與其他人不同,但下一個“while”可以設定另一個變數做等于它。
uj5u.com熱心網友回復:
嘗試只使用一個 while 回圈,并測驗所有的可能性。這不是一個可擴展的解決方案,但如果您只需要 4 個唯一值,那么這將完成這項作業。您甚至不需要初始化變數,因為從一開始它們都是未定義的,因此在回圈中它們將獲得值。
function myFunction()
{
let var1;
let var2;
let var3;
let var4;
while (var1 == var2 || var1 == var3 || var1 == var4 || var2 == var3 || var3 == var4 || var2==var4)
{
var1 = arr[Math.floor(Math.random() * arr.length)].name;
var2 = arr[Math.floor(Math.random() * arr.length)].name;
var3 = arr[Math.floor(Math.random() * arr.length)].name;
var4 = arr[Math.floor(Math.random() * arr.length)].name;
}
console.log(var1);
console.log(var2);
console.log(var3);
console.log(var4);
}
}
uj5u.com熱心網友回復:
一種可能的方法是從可用元素池中洗掉所選元素。
function myFunction() {
const pool = [...arr]; // <-- make a shallow copy
const numberOfRandomsToGet = 4; // <-- number of random elements to get
const randomNames = []; // <-- store here the random names
for (let n = 0; n < numberOfRandomsToGet; n) {
let randomIndex = getRandomInt(0, pool.length - 1); // <-- generate random Index
const randomElem = pool[randomIndex]; // <-- get random element at randomIndex
if (randomElem) {
pool.splice(randomIndex, 1); // remove selected element from the "pool"
randomNames.push(randomElem.name); // add name
}
}
console.log(randomNames); // dump generated random names to console
}
作業堆疊閃電戰
uj5u.com熱心網友回復:
首先,隨機打亂陣列,然后從陣列中取出前四個值。這保證您從陣列中選擇四個不同的元素。它還可以更輕松地擴展到更大的陣列或選擇比四個元素更多(或更少)的元素,并且可能在邊緣情況下表現更好。
let arr = [{name:"a"},{name:"b"},{name:"c"},{name:"d"},{name:"e"},{name:"f"}];
arr.sort((a, b) => Math.random() < 0.5);
let var1 = arr[0].name;
let var2 = arr[1].name;
let var3 = arr[2].name;
let var4 = arr[3].name;
請注意,這會修改 中元素的順序arr,因此如果您需要保留 的順序,請對該陣列的副本執行排序操作arr。
此外,雖然此處顯示的非常簡單且易于記憶的 shuffle 技術非常適合這個非常小的示例陣列,但如果您正在對非常大的陣列進行 shuffle,您可能會考慮性能更好的眾所周知的 shuffling 演算法。
另一種方法是跟蹤您從陣列中隨機選擇的索引,并重復生成新的隨機索引以避免重復。這避免了修改arr陣列,這可能很重要,具體取決于您的用例。
let arr = [{name:"a"},{name:"b"},{name:"c"},{name:"d"},{name:"e"},{name:"f"}];
function takeUniqueRandom(arr, indexesUsed) {
let index = -1;
while (index < 0 || indexesUsed.includes(index)) {
index = Math.floor(Math.random() * arr.length);
}
indexesUsed.push(index);
return arr[index];
}
let indexesUsed = [];
let var1 = takeUniqueRandom(arr, indexesUsed).name;
let var2 = takeUniqueRandom(arr, indexesUsed).name;
let var3 = takeUniqueRandom(arr, indexesUsed).name;
let var4 = takeUniqueRandom(arr, indexesUsed).name;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/317179.html
標籤:javascript html 数组
上一篇:測驗模擬服務然后/捕捉功能-Angular/Karma
下一篇:如何增加整個標簽的字體大小
