[英]Getting n random elements from array and creating duplicates when there's not enough elements
我有對象數組,例如:
let array1 = [
{name: '1', image: '1.jpg'},
{name: '2', image: '2.jpg'},
{name: '3', image: '4.jpg'},
{name: '4', image: '5.jpg'},
];
我想得到它的n個隨機元素,並找到了用於此目的的函數:
function getRandom(arr, n) {
var result = new Array(n),
len = arr.length,
taken = new Array(len);
while (n--) {
var x = Math.floor(Math.random() * len);
result[n] = arr[x in taken ? taken[x] : x];
taken[x] = --len in taken ? taken[len] : len;
}
return result
}
唯一的問題是,當我想讓n> arr.length時,這不起作用。 我想弄清楚在這種情況下如何增加元素數量。 例如,重復其中已經存在的元素。
我嘗試添加條件:
if(n > len) {
arr.push(arr);
console.log(arr);
}
但這對我沒有好處,因為元素被作為另一個對象推送,而不是單獨檢查console.log:
0: {name: "1", image: "1.jpg"}
1: {name: "2", image: "2.jpg"}
2: {name: "3", image: "4.jpg"}
3: {name: "4", image: "5.jpg"}
4: Array(5)
0: {name: "1", image: "1.jpg"}
1: {name: "2", image: "2.jpg"}
2: {name: "3", image: "4.jpg"}
3: {name: "4", image: "5.jpg"}
4: (5) [{…}, {…}, {…}, {…}, Array(5)]
length: 5
我嘗試過的其他方法均無效。 如果有人能找到解決方法,我將非常感激。
/////////編輯-整個函數getRandom(arr,n):
function getRandom(arr, n) {
var result = new Array(n),
len = arr.length,
taken = new Array(len);
if (n > len)
throw new RangeError("getRandom: more elements taken than available");
while (n--) {
var x = Math.floor(Math.random() * len);
result[n] = arr[x in taken ? taken[x] : x];
taken[x] = --len in taken ? taken[len] : len;
}
if (arr == warmUpAll) {
document.getElementById("warmup").innerHTML = '<span class="exerciseheader">Warm Up - 10 minutes</span>' + "</br>" ;
}
else if (arr == legsAll){
document.getElementById("legsDisplay").innerHTML = '<span class="exerciseheader">Legs</span>' + "</br>";
}
for (let i=0;i<result.length;i+=1) {
let displayname = document.createTextNode(result[i].name);
if (arr == warmUpAll) {
source = './images/warmUp/' + result[i].image;
warmUpSources.push(source);
document.getElementById('warmup').appendChild(displayname);
document.getElementById('warmup').appendChild(document.createElement("br" ));
}
else if (arr == armsAll) {
source = './images/arms/' + result[i].image;
armsSources.push(source);
document.getElementById('armsDisplay').appendChild(displayname);
document.getElementById('armsDisplay').appendChild(document.createElement("br" ));
}
}
}
當前,您的代碼給出了額外括號的語法錯誤,並刪除了該括號,但僅返回1個隨機值。 它顯然沒有循環。 你可以試試這個
function fillArrayRandomly(array, n) {
let res = [];
while (res.length !== n) {
let randomValue = array[Math.floor(Math.random() * array.length)];
res.push(randomValue);
}
return res;}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.