0
votes

Saisir au hasard 3 éléments d'un tableau, où le 3ème article peut être un "restaurant" mais ne doit pas être

Je m'excuse pour le titre mal écrit. Je ne savais pas comment l'écrire exactement. J'ai un tableau. J'ai besoin de saisir au hasard trois articles de la matrice. Un seul article peut être un "restaurant" et le restaurant ne peut jamais aller dans la troisième position.

Permettez-moi d'expliquer avec un exemple. Voici un exemple de tableau p> xxx pré>

Mon code actuel passe à travers ce tableau et attrape au hasard trois éléments. Les positions 1 et 2 peuvent jamais forts> ont un restaurant en eux afin qu'ils doivent être pris à partir des articles avec la propriété de restaurant définie pour faux em>. La 3ème position peut forte> avoir un restaurant mais je ne veux pas qu'il toujours strong> soit un restaurant. P>

Voici mon code actuel: P >

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)


0 commentaires

4 Réponses :


1
votes

Utilisez une boucle entière. Sélectionnez un élément de sélection au hasard - Si vous ne choisissez pas le troisième élément et qu'un restaurant est cueilli, ne sauvegardez pas le choix et laissez la boucle entière à nouveau à nouveau (jusqu'à ce que vous ayez trois éléments).

ou

Faites un tableau temporaire sans les restaurants, puis sélectionnez au hasard à partir de ce tableau deux fois. Puis choisissez au hasard dans le tableau normal. S'il correspond à l'un des deux que vous avez déjà, procédez à nouveau (utilisez une boucle de temps).


0 commentaires

0
votes
const third = shuffledArray[0]
const [first, second] = first two no-resturant item in shuffledArray.slice(1)

0 commentaires

1
votes

Vous pouvez essayer quelque chose comme ça.

    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);


1 commentaires

J'apprécie vraiment la réponse mais je vais y aller avec la réponse de Toribio depuis sa séjournement en ligne avec mon code actuel.



1
votes

Vous pouvez continuer à utiliser la méthode de shuffle afin que vous ne puissiez pas finir de sélectionner des doublures comme avec une indexation aléatoire simple, vous simplement extraire le premier élément de la matrice mélangée et appelez-le «troisième». Ensuite, vous filtrez des non-restaurants (et tranchez le premier index avant parce que nous l'avons déjà sélectionné) et sélectionnez des éléments 2 éléments:

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];


0 commentaires