Last active
December 11, 2023 11:16
-
-
Save justin-lyon/99c2ef95e38e2cdf65f0e4a1d3dd3da1 to your computer and use it in GitHub Desktop.
Array.prototype and Iterators fun with Dragons.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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