目前,此代碼生成包含 10 個物件的陣列,其中包含值編號并顯示。編號從 0 到 9 是隨機的,因此可以有重復。有沒有辦法,我只能獲得唯一的(所有具有不同數值的物件)編號?
const newArray = Array(10)
.fill()
.map(() => {
return { number: Math.floor(Math.random() * 10), display: false };
});
uj5u.com熱心網友回復:
您需要簡單地創建一個所需長度的陣列并用整數填充它,然后對陣列進行洗牌。
您可以采用不同的方法來洗牌陣列,其中之一是Fisher Yates Shuffle。
function shuffle(array) {
for (let i = array.length - 1; i > 1; i--) {
const j = Math.floor(Math.random() * (i 1));
[array[i], array[j]] = [array[j], array[i]];
}
}
const nums = Array.from({ length: 10 }, (_, i) => i);
shuffle(nums);
console.log(nums);
uj5u.com熱心網友回復:
不使用洗牌的答案:
const ARRAY_LENGTH = 10;
//create the array [0, 1, ..., ARRAY_LENGTH]
let options = Array.from(Array(ARRAY_LENGTH).keys());
//create the asked for array
let result = Array(ARRAY_LENGTH).fill().map(()=> {
//pick a random element from the `options` array...
let optionIndex = Math.floor(Math.random()*options.length);
let number = options[optionIndex];
//...remove it from the array (so that it can't be picked again)
options.splice(optionIndex, 1);
//use it and continue to next element
return { number, display: false };
});
console.log(result);
uj5u.com熱心網友回復:
有不同的方法可以做到這一點。
但我認為這將是最優雅的方式,因為你不需要第二個陣列并且你得到了 O(N):
構建一個包含 10 個數字的陣列。然后遍歷陣列。用您所在地區的隨機選擇的專案交換專案。瞧,你已經洗牌了你的陣列。
var arr = [0, 1, 2 ,3 ,4 ,5 ,6 ,7 ,8, 9];
for (let i = 0; i < arr.length; i) {
let rands = Math.floor(Math.random() * 10);
[arr[i], arr[rands]] = [arr[rands], arr[i]];
}
console.log(arr);
uj5u.com熱心網友回復:
復雜度相當高,但使用 10 個值執行代碼仍然很快:
const seenNumbers = new Set();
newArray = Array(10)
.fill()
.map(() => {
let number = Math.floor(Math.random() * 10);
while (seenNumbers.has(number)) {
number = Math.floor(Math.random() * 10);
}
seenNumbers.add(number);
return { number: number, display: false };
});
seenNumbers.clear();
console.log(newArray);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/493432.html
上一篇:js中的多個字母計數