Skip to content

Instantly share code, notes, and snippets.

@justin-lyon
Last active December 11, 2023 11:16
Show Gist options
  • Save justin-lyon/99c2ef95e38e2cdf65f0e4a1d3dd3da1 to your computer and use it in GitHub Desktop.
Save justin-lyon/99c2ef95e38e2cdf65f0e4a1d3dd3da1 to your computer and use it in GitHub Desktop.
Array.prototype and Iterators fun with Dragons.
// Here are some handy Array.prototype methods.
// Also known as higher order functions.
// An Array of Dragon objects for us to work with.
const dragons = [
{ name: 'Fluffykins', color: 'red', size: 'tiny', type: 'fire' },
{ name: 'Puff', color: 'purple', size: 'medium', type: 'time' },
{ name: 'Randy', color: 'green', size: 'small', type: 'nature' },
{ name: 'Smaug', color: 'black', size: 'large', type: 'fire' },
{ name: 'Draco', color: 'green', size: 'medium', type: 'fire' },
{ name: 'Bahamut', color: 'black', size: 'large', type: 'fire' },
{ name: 'Bigsby', color: 'blue', size: 'small', type: 'ice' },
{ name: 'Tiamat', color: 'black', size: 'large', type: 'fire' },
{ name: 'Alduin', color: 'gray', size: 'large', type: 'fire' },
{ name: 'Dracolich', color: 'white', size: 'large', type: 'undead' },
{ name: 'Spyro', color: 'purple', size: 'tiny', type: 'fire' }
]
// Make an Array of Dragon Names
const dragonNames = dragons
.map(dragon => dragon.name)
// Make an Array of all Large Fire Dragons
const largeFireDragons = dragons
.filter(dragon => dragon.size === 'large' && dragon.type === 'fire')
// Make an Array of Purple Dragon Names
// Note: We can chain Array.prototype methods together
const purpleDragonNames = dragons
.filter(dragon => dragon.color === 'purple')
.map(dragon => dragon.name)
const hasType = type => {
// Flatten an array to a Boolean (Or any other data type/structure).
return dragons.reduce((hasType, dragon) => {
return hasType || dragon.type === type
}, false)
}
const hasUndead = hasType('undead');
console.log('dragons', JSON.stringify(dragons, null, 2));
console.log('dragonNames', dragonNames);
console.log('largeFireDragons', JSON.stringify(largeFireDragons, null, 2));
console.log('purpleDragonNames', JSON.stringify(purpleDragonNames, null, 2));
console.log('hasUndead', hasUndead);
use std::fmt::Debug;
fn main() {
let dragons = get_dragons();
let dragon_names: Vec<&str> = dragons
.iter()
.map(|d| d.name)
.collect();
println!("Dragon Names: {:?}", dragon_names);
let large_fire_dragons: Vec<_> = dragons
.iter()
.filter(|d| d.size == "large" && d.element == "fire")
.collect();
println!("Large Fire Dragons: {:?}", large_fire_dragons);
let purple_dragon_names: Vec<&str> = dragons
.iter()
.filter(|d| d.color == "purple")
.map(|d| d.name)
.collect();
println!("Purple Dragon Names: {:?}", purple_dragon_names);
let has_undead = has_element(&dragons, "undead");
println!("Has Undead Dragons: {:?}", has_undead);
}
fn has_element(dragons: &Vec<Dragon>, element: &str) -> bool {
dragons
.into_iter()
.any(|d| d.element == element)
}
#[derive(Debug)]
struct Dragon<'a> {
name: &'a str,
color: &'a str,
size: &'a str,
element: &'a str,
}
fn get_dragons<'dragons>() -> Vec<Dragon<'dragons>> {
vec![
Dragon {
name: "Fluffykins",
color: "red",
size: "tiny",
element: "fire",
},
Dragon {
name: "Puff",
color: "purple",
size: "medium",
element: "time",
},
Dragon {
name: "Randy",
color: "green",
size: "small",
element: "nature",
},
Dragon {
name: "Smaug",
color: "black",
size: "large",
element: "fire",
},
Dragon {
name: "Draco",
color: "green",
size: "medium",
element: "fire",
},
Dragon {
name: "Bahamut",
color: "black",
size: "large",
element: "fire",
},
Dragon {
name: "Bigsby",
color: "blue",
size: "small",
element: "ice",
},
Dragon {
name: "Tiamat",
color: "black",
size: "large",
element: "fire",
},
Dragon {
name: "Alduin",
color: "gray",
size: "large",
element: "fire",
},
Dragon {
name: "Dracolich",
color: "white",
size: "large",
element: "undead",
},
Dragon {
name: "Spyro",
color: "purple",
size: "tiny",
element: "fire",
},
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment