Given an array:
var arr = [1,,2,5,6,,4,5,6,,];
Count how many empty values is has: (length – length after removing the empty values)
var empties = arr.length - arr.filter(function(x){ return true }).length;
// return 3
or something like this
arr.empties = arr.length;
arr.forEach(function(x){ arr.empties-- });
// arr.empties returns 3
Is this the best way or am I missing something?
Based on your comments to another answer, it looks like you’re after the shortest method. Well, you might want to consider a variation of your own example:
All you’re doing is passing a native function rather than an anonymous function, saving a few precious bytes. Any native constructor or function will do, as long as it doesn’t return a boolean.
You need to be more specific about what you would consider the ‘best way’. For instance, some methods will give better performance than others, some are more concise and some have better compatibility.
The solutions you mention in the post require browsers to be compatible with the ECMAScript 5th Edition specification, so they won’t work in some older browsers (read: IE8 and lower).
The “best” all-round approach is a simple loop. It’s not as concise as your methods, but it will no doubt be the fastest and most compatible:
This makes use of loop optimisations (using
whileand decrementing is faster thanfor).Another approach would be to sort the array so that
undefineditems are all at the end and use a loop to iterate backwards:This approach would modify the original array and remove those items which may not be what you want. However, it may be much faster on very large arrays.