An object in javascript is a collection of key-values pairs,also called a property. Anything that is not a number,string,undefined,symbol or Boolean is an object. Null is a special kind of object, by the way. There are 3 types of objects in Javascript: object Literal {}
,arrays []
and functions.
Object literals, though, contain certain payload properties that might come from a REST api or user input,before rendering them it is important to check for their presence. In react, we always assume and check if each and every object has an id property.
Here are 3 ways to do that.
- Using the in method
The in JavaScript method checks if the property exists in an object,returns true if present,false if absent.
let user={name:"Mark Twain",id:1};
if("id" in user)
console.log(` ${user.id} found `)
else
console.log(`The property does not exist`)
- Checking if an object property is undefined
If a property of an Object does not exist, it will always be undefined,so to check we use this comparison expression: javascript user.id !== undefined
It will be true if the object property exists,false if not, in this we assume the object is not available.
In web development, moreso React.js, we always presume that every object from REST api has an id property.
let user={name:"Mark Twain",id:1}
// in our case weโre checking if user has property id
if (user.id !== undefined) console.log(` ${user.id} found `);
else console.log(`The property does not exist`);
3.Using has hasOwnProperty method
The hasOwnProperty is a built in method that takes the object and evaluates it against a given property,return true if property exists or false if not.
let user={name:"Mark Twain",id:1}
if (user.hasOwnProperty("id")) console.log(` ${user.id} found`);
else console.log(`user does not exist`);
We can write a javascript fuction test all of this;
let user={} // initially user object its null
async function fetchUser () {
// we're fetching user with id number 1;
const url = "https://jsonplaceholder.typicode.com/users/1";
try {
const response = await fetch(url);
const payload = await response.json();
// check if object exists by checking if id property is not undefined..
// also note the optional chaining, if nothing returned, if payload is null or undefined,
//it will just end there;
if (payload?.id !== undefined) return payload
} catch (error) {
console.error(error?.message);
}
}
We then fetch the user from the server when DOM is loaded.
// fetch user when the DOM loads
window.addEventListener("DOMContentLoaded", async ()=>{
// we the assign user to response object
user= await fetchUser() // asynchronous network request to get a user object
})
Finally, we can create a React component that uses the 3 methods in setting state,at useEffect and JSX expressions and evaluations.
function RenderPost() {
const [post, setPost] = React.useState({}); // we start with an empty object literal
const [spinner, setSpinner] = React.useState(false);
// we're fetching one post
const fetchPost = async (postId = 1) => {
try {
setSpinner(true);
const url = `https://jsonplaceholder.typicode.com/posts/${postId}`;
const response = await fetch(url);
const payload = await response.json();
// check if object exists by checking if id property is not undefined..
if (payload?.id !== undefined) setPost(payload);
setSpinner(false);
} catch (error) {
setSpinner(false);
console.error(error?.message);
}
};
React.useEffect(() => {
// if the post is empty just fetch it, we use negation symbol to do that
if (!post.hasOwnProperty("id")) fetchPost(1);
}, []);
// pending state
if (spinner)
return (
<div className="container">
<p>Loading post</p>
</div>
);
// resolved or rejected
return (
<div className="container">
{/**We use the in Method to check if object has id property */}
{"id" in post ? (
<div>
<h3>{post.title}</h3>
<p>{post.body}</p>
</div>
) : (
<p>No post found</p>
)}
</div>
);
}
We check for undefined inside fetchPost function to check if payload object was found, hasOwnProperty inside the useEffect to see if post object is already available and in method in JSX to evaluate presence of the object before rendering it.
Top comments (0)