Intro
This is going to be an ongoing "documentation" of cool little hacks that I've learned. Each entry will consist of what I did originally and what the better version is.
Hack 1: Using and
instead of conditional (React)
Context:
While iterating through a list of phone numbers, show <PhoneIcon />
next to only the first phone number.
Original code: Using a ternary operator
{phoneNumbers.map((phoneNumber, i) => (
<div>
{i === 0 ? <PhoneIcon /> : ''}
{phoneNumber}
</div>
)
Better: Using and or statement
contact.phones?.map((phoneNumber, i) => (
<div>
{!i && (<PhoneIcon />)}
{phoneNumber}
</div>
)
Explanation:
This works because the truthiness value of 0 is false. So while iterating through the phone numbers, if the index is 0 we can conditionally show the <PhoneIcon />
with !i && (<PhoneIcon />)
Hack 2: Joining an array
Context:
Sometimes there is an object with empty values, and I don't want this object to display if the values are empty. The problem is, empty values can be either null
, or empty strings ''
.
Example:
{ firstName: null,
lastName: null,
phone: '',
location: null,
favoriteColor: ''
}
Original code:
const emptyChecker = (obj) => {
const nulls = Object.values(obj).filter(val => val === null)
const empties = Object.values(obj).filter(val => val === '')
// checks length of nulls && empties against length of the whole
return nulls.concat(empties).length === Object.values(obj).length
}
Iterate through the values of the object and if they're null
add them to an array. Do it again, but with empty strings. Concat the 2 arrays and compare the length to the original.
Better:
const emptyChecker = (obj) => {
const empties = Object.values(obj).filter(val => !val)
// checks length of nulls && empties against length of the whole
return empties.length === Object.values(obj).length
}
Explanation:
This works because instead of iterating through the object values twice we convert the values to booleans as they're being iterated over. This works because null
has a truthiness value of false
as does an empty string ''
. Therefore .filter(val => !val)
only adds false values to the array and then we can compare the length to to the original.
Hack 3: Dealing with objects conditionally.
Context:
Say you have a function that edits an object. It could be something like an onChange
that needs to change the state of your application.
Original code:
I have the following code to update the contact. This is exaggerated code to prove a point.
const [contact, setContact] = {
name: 'Aaron',
job: 'developer',
address: '123 fourth st.'
}
const onChange = key => e => {
const val = e.target.value
if (key === 'name') {
setContact(prevState => ({...prevState, 'name': val})
} else if (key === 'occupation') {
setContact(prevState => ({...prevState, 'job': val})
} else if (key === 'address') {
setContact(prevState => ({...prevState, 'address': val})
}
}
Better Way:
const onChange = key => e => {
const val = e.target.value
setContact(prevState => ({...prevState, [key]: val})
}
Top comments (0)