Получение n случайных элементов из массива и создание дубликатов, когда не хватает элементов

1

У меня есть массивы объектов, например:

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

Ни одна другая вещь, которую я пробовал, не работает. Если бы кто-то мог понять дорогу, я бы очень признателен.

////////edit - целая функция 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" ));
      }
  }
}
  • 0
    getRandom кажется, не хватает какой-то строки (с?)
  • 0
    Не могли бы вы опубликовать текущий рабочий код?
Показать ещё 7 комментариев
Теги:
arrays
random

1 ответ

0

В настоящее время ваш код дает синтаксическую ошибку в дополнительном скобке и удаляет скотч, который он работает, но возвращает только одно случайное значение. Его явно не хватает циклы. вы можете попробовать это

function fillArrayRandomly(array, n) {
let res = [];
while (res.length !== n) {
    let randomValue = array[Math.floor(Math.random() * array.length)];
    res.push(randomValue);
}
return res;}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню