I'm trying to create a new array with 5 random names taken from an array with 897 names. This is what I tried to do but I'm not sure how to specify that I only want 5 names:
for(let i = 0; i < pokemon.all().length; i ){
pokedex = [i];
};
app.get('/dex', (req, res) => {
res.send(pokedex)
});
CodePudding user response:
function pickNOf(list, n) {
// - create a new shallow array copy.
// - does decouple the original reference, thus it
// prevents its further mutation by e.g. `splice`.
list = Array.from(list);
return Array
// - creates an iterable array of the desired length ...
.from({ length: n })
// ... thus it can be iterated by e.g. `map` or `flatMap`.
.flatMap(() =>
// - `splice` does mutate the list by removing a
// single item from its randomly chosen index.
list.splice(Math.floor(Math.random() * list.length), 1)
);
}
const listOfAllPokemonNames = [
"Bulbasaur", "Ivysaur", "Venusaur", "Charmander", "Charmeleon",
"Charizard", "Squirtle", "Wartortle", "Blastoise", "Caterpie",
"Metapod", "Butterfree", "Weedle", "Kakuna", "Beedrill", "Pidgey"
];
console.log(
"pickNOf(listOfAllPokemonNames, 5) ...",
pickNOf(listOfAllPokemonNames, 5)
);
console.log(
"pickNOf(listOfAllPokemonNames, 9) ...",
pickNOf(listOfAllPokemonNames, 9)
);
console.log(
"pickNOf(listOfAllPokemonNames, 3) ...",
pickNOf(listOfAllPokemonNames, 3)
);
.as-console-wrapper { min-height: 100%!important; top: 0; }
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>
Usage within the OP's code then does look like this ...
function pickNOf(list, n) {
list = Array.from(list);
return Array
.from({ length: n })
.flatMap(() =>
list.splice(Math.floor(Math.random() * list.length), 1)
);
}
app.get('/dex', (req, res) => {
res.send(pickNOf(pokemon.all(), 5))
});
CodePudding user response:
Take a look at this, use Math.random() to generate random index and get it from pokemons array, then unset the value from pokemons to have no doublon in pokedex.
let pokemons = ['pika1','pika2','pika3','pika4','pika5','pika6','pika7']
let pokedex = [];
for (i = 0; i < 5; i ) {
id = Math.floor(Math.random() * pokemons.length);
pokedex.push(pokemons[id]);
pokemons.slice(i,1)
}
//app.send() here...
console.log(pokedex)
<iframe name="sif2" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>
EDIT: Considering you have a pokemon.random() generator(?)
in this npm package. Simply use:
let pokedex = [];
for(let i = 0; i < 5; i )
pokedex.push(pokemon.random());
app.get('/dex', (req, res) => {
res.send(pokedex)
});
EDIT N°2: Using Objects
let pokedex = [];
for (i = 0; i < 5; i ) {
let pokemon = {
name:pokemon.random(),
attack:Math.floor(Math.random() * (100 - 50 1) 50),
defense:Math.floor(Math.random() * (100 - 50 1) 50)
};
pokedex.push(pokemon);
}
function attack(attacker,defenser)
{
defenser.defense -= attacker.attack
return attacker && defenser;
}
function fakeMatch(attacker,defenser)
{
attack(attacker,defenser)
}
console.log(pokedex)
fakeMatch(pokedex[0],pokedex[3])
console.log('RESULT Pokedex 0 attacked Pokedex 3')
console.log(pokedex)
EDIT N°3: Object with function (proper way)
let pokemons = ['pika1', 'pika2', 'pika3', 'pika4', 'pika5', 'pika6', 'pika7']
let pokedex = [];
for (i = 0; i < 5; i ) {
let id = Math.floor(Math.random() * pokemons.length);
let pkm = {
name: pokemons[id],
life: 100,
strenght: Math.floor(Math.random() * (100 - 50 1) 50),
defense: Math.floor(Math.random() * (100 - 50 1) 50),
attack: function(target) {
target.life -= this.strenght;
console.log(this.name ' attack ' target.name)
console.log(target.name ' loose ' this.strenght ' of life')
//Test if life > 0 or anything else with % defense etc...
if (target.life <= 0) {
console.log(target.name ' is dead')
}
}
};
pokedex.push(pkm);
pokemons.slice(id, 1)
}
pokedex[0].attack(pokedex[1]);
<iframe name="sif3" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>