function playSound(e) {
const audio = document.querySelector(`audio[data-key="${e.keyCode}"]`)
const key = document.querySelector(`.key[data-key="${e.keyCode}"]`)
if (!audio) return
audio.currentTime = 0
audio.play()
key.classList.add('playing')
}
window.addEventListener('keydown', playSound)
function removeTransition(e) {
if(e.propertyName !== 'transform') return;
this.classList.remove('playing')
}
const keys = document.querySelectorAll('.key')
keys.forEach(key => key.addEventListener('transitionend', removeTransition))
const secondHand = document.querySelector('.second-hand')
const minuteHand = document.querySelector('.min-hand')
const hourHand = document.querySelector('.hour-hand')
function updateSeconds(now) {
const seconds = now.getSeconds()
const secondsDegrees = ((seconds / 60) * 360) + 90
secondHand.style.transform = `rotate(${secondsDegrees}deg)`
}
function updateMinutes(now) {
const minutes = now.getMinutes()
const minutesDegrees = ((minutes / 60) * 360) + 90
minuteHand.style.transform = `rotate(${minutesDegrees}deg)`
}
function updateHours(now) {
const hours = now.getHours()
const hoursDegrees = ((hours / 12) * 360) + 90
hourHand.style.transform = `rotate(${hoursDegrees}deg)`
}
function setDate() {
const now = new Date()
updateSeconds(now)
updateMinutes(now)
updateHours(now)
}
setInterval(setDate, 1000);
<script>
// Get your shorts on - this is an array workout!
// ## Array Cardio Day 1
// Some data we can work with
const inventors = [
{ first: 'Albert', last: 'Einstein', year: 1879, passed: 1955 },
{ first: 'Isaac', last: 'Newton', year: 1643, passed: 1727 },
{ first: 'Galileo', last: 'Galilei', year: 1564, passed: 1642 },
{ first: 'Marie', last: 'Curie', year: 1867, passed: 1934 },
{ first: 'Johannes', last: 'Kepler', year: 1571, passed: 1630 },
{ first: 'Nicolaus', last: 'Copernicus', year: 1473, passed: 1543 },
{ first: 'Max', last: 'Planck', year: 1858, passed: 1947 },
{ first: 'Katherine', last: 'Blodgett', year: 1898, passed: 1979 },
{ first: 'Ada', last: 'Lovelace', year: 1815, passed: 1852 },
{ first: 'Sarah E.', last: 'Goode', year: 1855, passed: 1905 },
{ first: 'Lise', last: 'Meitner', year: 1878, passed: 1968 },
{ first: 'Hanna', last: 'Hammarström', year: 1829, passed: 1909 }
];
const people = ['Beck, Glenn', 'Becker, Carl', 'Beckett, Samuel', 'Beddoes, Mick', 'Beecher, Henry', 'Beethoven, Ludwig', 'Begin, Menachem', 'Belloc, Hilaire', 'Bellow, Saul', 'Benchley, Robert', 'Benenson, Peter', 'Ben-Gurion, David', 'Benjamin, Walter', 'Benn, Tony', 'Bennington, Chester', 'Benson, Leana', 'Bent, Silas', 'Bentsen, Lloyd', 'Berger, Ric', 'Bergman, Ingmar', 'Berio, Luciano', 'Berle, Milton', 'Berlin, Irving', 'Berne, Eric', 'Bernhard, Sandra', 'Berra, Yogi', 'Berry, Halle', 'Berry, Wendell', 'Bethea, Erin', 'Bevan, Aneurin', 'Bevel, Ken', 'Biden, Joseph', 'Bierce, Ambrose', 'Biko, Steve', 'Billings, Josh', 'Biondo, Frank', 'Birrell, Augustine', 'Black, Elk', 'Blair, Robert', 'Blair, Tony', 'Blake, William'];
// Array.prototype.filter()
// 1. Filter the list of inventors for those who were born in the 1500's
const fifteen = inventors.filter(function(inventor) {
if (inventor.year >= 1500 && inventor.year < 1600) {
return true
}
});
console.table(fifteen)
// Array.prototype.map()
// 2. Give us an array of the inventors' first and last names
// const inventorNames = inventors.map(function(inventor) {
// return `${inventor.first} ${inventor.last}`
// })
const inventorNames = inventors.map(inventor =>`${inventor.first} ${inventor.last}`)
console.table(inventorNames)
// Array.prototype.sort()
// // 3. Sort the inventors by birthdate, oldest to youngest
// const sortedInventors = inventors.sort(function(first, second) {
// if(first.year > second.year) {
// return 1
// } else {
// return -1
// }
// })
const sortedInventors = inventors.sort((first, second) => first.year > second.year ? 1 : -1)
console.table(sortedInventors)
// Array.prototype.reduce()
// 4. How many years did all the inventors live?
// const totalYears = inventors.reduce(function(total, inventor) {
// return total + (inventor.passed - inventor.year)
// }, 0)
const totalYears = inventors.reduce((total, inventor) => {
return total + (inventor.passed - inventor.year)
}, 0)
console.log(totalYears)
// 5. Sort the inventors by years lived
const sortedByAge = inventors.sort((first, second) => {
var firstAge = (first.passed - first.year)
var secondAge = (second.passed - second.year)
if (firstAge > secondAge) {
return 1
} else {
return -1
}
})
console.table(sortedByAge)
// 6. create a list of Boulevards in Paris that contain 'de' anywhere in the name
// https://en.wikipedia.org/wiki/Category:Boulevards_in_Paris
//
// const category = document.querySelector('.mw-category')
// const links = Array.from(category.querySelectorAll('a'))
//
// const de = links
// .map(link => link.textContent)
// .filter(streetName => streetName.includes('de'))
// 7. sort Exercise
// Sort the people alphabetically by last name
const alphaPeople = people.sort(function(a, b) {
const [aLast, aFirst] = a.split(' ')
const [bLast, bFirst] = b.split(' ')
if (aLast > bLast) {
1
} else {
-1
}
})
console.table(alphaPeople)
// 8. Reduce Exercise
// Sum up the instances of each of these
const data = ['car', 'car', 'truck', 'truck', 'bike', 'walk', 'car', 'van', 'bike', 'walk', 'car', 'van', 'car', 'truck' ];
const sumVehicles = data.reduce((result, vehicle) => {
if (!result[vehicle]) {
result[vehicle] = 0
}
result[vehicle]++
return result
}, {})
console.table(sumVehicles)
</script>
<script>
// ## Array Cardio Day 2
const people = [
{ name: 'Wes', year: 1988 },
{ name: 'Kait', year: 1986 },
{ name: 'Irv', year: 1970 },
{ name: 'Lux', year: 2015 }
];
const comments = [
{ text: 'Love this!', id: 523423 },
{ text: 'Super good', id: 823423 },
{ text: 'You are the best', id: 2039842 },
{ text: 'Ramen is my fav food ever', id: 123523 },
{ text: 'Nice Nice Nice!', id: 542328 }
];
// Some and Every Checks
// Array.prototype.some() // is at least one person 19 or older?
const isAdult = people.some(person => {
const currentYear = (new Date()).getFullYear()
return currentYear - person.year >= 19
})
console.log(isAdult)
// Array.prototype.every() // is everyone 19 or older?
const allAdult = people.every(person => {
const currentYear = (new Date()).getFullYear()
return currentYear - person.year >= 19
})
console.log(allAdult)
// Array.prototype.find()
// Find is like filter, but instead returns just the one you are looking for
// find the comment with the ID of 823423
// const comment = comments.find(comment => comment.id === 823423)
function findCommentById(id) {
return comments.find(comment => comment.id === id)
}
const comment = findCommentById(823423)
console.log(comment)
// Array.prototype.findIndex()
// Find the comment with this ID
// delete the comment with the ID of 823423
// const commentIndex = comments.findIndex(comment => comment.id === 823423)
function findCommentIndexById(id) {
return comments.findIndex(comment => comment.id === id)
}
const commentIndex = findCommentIndexById(823423)
comments.splice(commentIndex, 1)
console.log(comments)
</script>
<script>
// start with strings, numbers and booleans
// let age = 100;
// let age2 = age;
// console.log(age, age2)
// age = 299
// console.log(age, age2)
//
// let name = 'Wes'
// let name2 = name
// console.log(name, name2)
// name = 'Max'
// console.log(name, name2)
// Let's say we have an array
const players = ['Wes', 'Sarah', 'Ryan', 'Poppy'];
// and we want to make a copy of it.
const team = players
console.log(players, team)
// You might think we can just do something like this:
// team[4] = 'Lux'
// console.log(players, team)
// however what happens when we update that array?
// now here is the problem!
// oh no - we have edited the original array too!
// Why? It's because that is an array reference, not an array copy. They both point to the same array!
// So, how do we fix this? We take a copy instead!
// one way
const team2 = players.slice()
// or create a new array and concat the old one in
const team3 = [].concat(players)
// or use the new ES6 Spread
const team4 = [...players]
// now when we update it, the original one isn't changed
const team5 = Array.from(players)
// The same thing goes for objects, let's say we have a person object
// with Objects
const person = {
name: 'Wes Bos',
age: 80
};
// and think we make a copy:
const captain = person
// how do we take a copy instead?
const cap2 = Object.assign({}, person, {number: 99})
console.log(cap2)
console.log(captain)
console.log(person)
// We will hopefully soon see the object ...spread
// Things to note - this is only 1 level deep - both for Arrays and Objects. lodash has a cloneDeep method, but you should think twice before using it.
// JSON.parse(JSON.stringify(object))
</script>
<script>
const list = Array.from(document.querySelectorAll('li'))
const totalSeconds = list.reduce((total, video) => {
const [mins, secs] = video.dataset.time.split(":").map(parseFloat)
let videoSeconds = (mins * 60) + secs
return total += videoSeconds
}, 0)
function secondsToMinutes(seconds) {
let hour = Math.floor(seconds / 3600)
let min = Math.floor(seconds % 3600 / 60)
let sec = seconds % 3600 % 60
return `${hour}:${min}:${sec}`
}
const totalTime = secondsToMinutes(totalSeconds)
console.log(totalTime)
</script>