In vanilla JS, you might want to run some code only if every item in an array meets a condition. Let's look at how you can do just that using the native Array.every() method!

This is not an April Fools' Day post, because fuck tradition 🙃

For our example, let's say you want to run some code only if all the checkboxes on a page are checked.

My good friend Chris Ferdinandi has reminded me that you could just get all the checked items using the :checked CSS selector:

// Get all the checked checkboxes
var checked = document.querySelectorAll("[type='checkbox']:checked");

With that in mind, on with the post! 😄

The first thing you'd want to do is get the checkboxes using the Document.querySelectorAll() method.

This returns a NodeList, though, which is similar to an array but doesn't have access to the Array.every() method. So you'd first need to convert the NodeList to an array:

// Get all the checkboxes as a NodeList
var checkboxes = document.querySelectorAll("[type='checkbox']");

// Convert the NodeList to an array
checkboxes = Array.prototype.slice.call(checkboxes);

The Array.every() method expects a callback function. It returns true if said callback function returns a truthy value for every item in the array; otherwise, it returns false. The possible parameters for the callback function are:

  • The current item being processed in the array;
  • The index of the current item; and
  • The array this method was called upon.

Only the first argument is required.

You could use an anonymous function, but I prefer to avoid anonymous functions wherever possible. I'll use a named function instead. Specifically, I'll use the isChecked() function I created for yesterday's post:

/**
* Check if a checkbox is checked
* @param {Object} checkbox The checkbox
* @returns {Boolean} Whether the checkbox is checked or not
*/

function isChecked (checkbox) {
return checkbox.checked;
}

To see if every item in my checkboxes array is checked, all I have to do is pass my isChecked() function into the Array.every() method:

if (checkboxes.every(isChecked)) {
// Do something if all checkboxes are checked
}

This method is supported in IE9 and above, but if you need it to work in older browsers, you can extend support further using a polyfill.