Случайно получить 3 элемента из массива, где 3-й элемент может быть «рестораном», но не обязательно - PullRequest
0 голосов
/ 20 февраля 2020

Я прошу прощения за плохо написанное название. Я не был уверен, как именно это написать. У меня есть массив. Мне нужно случайно получить три элемента из массива. Только один пункт может быть «рестораном», и ресторан может занимать ТОЛЬКО go на третьей позиции.

Позвольте мне объяснить на примере. Вот пример массива

el 1 - restaurant = false
el 2 - restaurant = true
el 3 - restaurant = true
el 4 - restaurant = false
el 5 - restaurant = false
el 6 - restaurant = false
el 7 - restaurant = true
el 8 - restaurant = false
el 9 - restaurant = false

Мой текущий код перебирает этот массив и случайным образом захватывает три элемента. Позиции 1 и 2 могут НИКОГДА не иметь ресторана в них, поэтому их нужно брать из предметов со свойством restaurant, установленным на false . 3-я позиция может иметь ресторан, но я не хочу, чтобы всегда был рестораном.

Вот мой текущий код:

const amountOfLocations = 3

// have list of locations
// shuffle it
for (let i = locations.length - 1; i > 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [locations[i], locations[j]] = [locations[j], locations[i]];
}

let selectedLocations = locations.slice(0, amountOfLocations)

Моя первоначальная мысль: мне нужно взять только 2 элемента из этого текущего l oop вместо 3, затем с помощью исходного массива удалить эти два элемента и снова перемешать массив, чтобы случайным образом получить еще один элемент, который затем будет размещены на 3-й позиции.

Ответы [ 4 ]

1 голос
/ 20 февраля 2020

Вы можете продолжить использовать метод shuffle, чтобы не заканчивать выбор дубликатов, как при обычном случайном индексировании, а просто извлечь первый элемент из массива shuffled и назвать его «третий». Затем вы отфильтровываете не-рестораны (и нарезаете первый индекс раньше, потому что мы его уже выбрали) и выбираете любые 2 элемента:

for (let i = locations.length - 1; i > 0; i--) {
  const j = Math.floor(Math.random() * (i + 1));
  [locations[i], locations[j]] = [locations[j], locations[i]];
}

let third = locations[0];
let [first, second] = locations.slice(1).filter(l => !l.restaurant);
let selectedLocations = [first, second, third];
1 голос
/ 20 февраля 2020

Вы можете попробовать что-то вроде этого.

    var array1 = [
     {'restaurant': true},
     {'restaurant': false},
     {'restaurant': false},
     {'restaurant': true},
     {'restaurant': false},
     {'restaurant': true},
     {'restaurant': false},
     {'restaurant': false},
     {'restaurant': false},
     {'restaurant': false},
     {'restaurant': true}
    ];

    var array2 = array1.filter((v) => {
      return v.restaurant === false;
    }).slice(0, 2);
    array2.push(array1[Math.floor(Math.random() * array1.length)]);

console.log(array2);

Вот ссылка на скрипку. https://jsfiddle.net/90gda2sb/

1 голос
/ 20 февраля 2020

Используйте целое l oop. случайным образом выберите элемент - если вы не выбираете третий элемент, а ресторан выбран, не сохраняйте этот выбор и дайте всему l oop снова запустить (пока у вас не будет трех элементов).

Или

Создайте временный массив без ресторанов в нем, а затем дважды выберите из этого массива случайный выбор. Затем случайным образом выберите из обычного массива. Если он совпадает с одним из двух, которые у вас уже есть, то получите его снова (используйте некоторое время l oop).

0 голосов
/ 20 февраля 2020
const third = shuffledArray[0]
const [first, second] = first two no-resturant item in shuffledArray.slice(1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...