Repository navigation
Iteration
sergio edited this page Oct 20, 2020
·
4 revisions
const myArray = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
for (const element of myArray) {
console.log(element);
}for (const <KEY> in <OBJECT>) {
// Code in the statement body
}const address = {
street1: '11 Broadway',
street2: '2nd Floor',
city: 'New York',
state: 'NY',
zipCode: 10004
};
for (const key in address) {
console.log(key);
}
// LOG: street1
// LOG: street2
// LOG: city
// LOG: state
// LOG: zipCodeconst address = {
street1: '11 Broadway',
street2: '2nd Floor',
city: 'New York',
state: 'NY',
zipCode: 10004
};
for (const key in address) {
console.log(address[key]);
}
// LOG: 11 Broadway
// LOG: 2nd Floor
// LOG: New York
// LOG: NY
// LOG: 10004As a general rule, don't use for...in with arrays because it iterates over the properties of an object in an arbitrary order ... one cannot depend on the seeming orderliness of iteration.
function find(array, criteriaFn) {
// initialize two variables, `current`, and `next`
// `current` keeps track of the element that we're
// currently on, just like we did when unpacking the
// array above; `next` is itself an array that keeps
// track of the elements (which might be arrays!) that
// we haven't looked at yet
let current = array
let next = []
// hey, a `while` loop! this loop will only
// trigger if `current` is truthy — so when
// we exhaust `next` and, below, attempt to
// `shift()` `undefined` (when `next` is empty)
// onto `current`, we'll exit the loop
//
// Note that we had to add on this || statement
// if current is the number 0 it won't be run in the
// loop. Recall your truthy / falsey rules! This is
// a subtle bug that went unnoticed in this code for
// many years!
while (current || current === 0) {
// if `current` satisfies the `criteriaFn`, then
// return it — recall that `return` will exit the
// entire function!
if (criteriaFn(current)) {
return current
}
// if `current` is an array, we want to push all of
// its elements (which might be arrays) onto `next`
if (Array.isArray(current)) {
for (let i = 0; i < current.length; i++) {
next.push(current[i])
}
}
// after pushing any children (if there
// are any) of `current` onto `next`, we want to take
// the first element of `next` and make it the
// new `current` for the next pass of the `while`
// loop
current = next.shift()
}
// if we haven't
return null
}
find(numberCollections, number => number > 5)
find(numberCollections, number => (typeof number === 'number' && number > 5))