What you are looking for is not the length of an array but the number values allocated in that array.
Array.length will NOT give you that result but the total number of values allocated.
A workarround is to count the properties of the object behind the array, with:
Object.keys(a).length
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Relationship_between_length_and_numerical_properties
But with some caveats:
- It will also count literal properties, like a.a_property. I do not think that is what you want. So, you will have to filter that result:
!(+el % 1) which check if el can be considered as numerical property even if it has a type of string.
- you want count only positive integers, so you have to filter them with:
+el>=0
- finally, as array size is limited to 2^32, you will to also filter positive integers greater than that:
+el < Math.pow(2,32)
Functionally, you will have your result with this filter:
Array.realLength= Object.keys(a).filter(function(el){return !(+el % 1) && +el>=0 && +el < Math.pow(2,32) ;}).length
Answer from Gaรซl Barbin on Stack OverflowFind Array length in Javascript - Stack Overflow
Are rhere any simpler ways to measure length of an array in JS?
Can I Use a Boolean Test on Array.length?
How does arr[arr.length-1] work?
Videos
What you are looking for is not the length of an array but the number values allocated in that array.
Array.length will NOT give you that result but the total number of values allocated.
A workarround is to count the properties of the object behind the array, with:
Object.keys(a).length
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Relationship_between_length_and_numerical_properties
But with some caveats:
- It will also count literal properties, like a.a_property. I do not think that is what you want. So, you will have to filter that result:
!(+el % 1) which check if el can be considered as numerical property even if it has a type of string.
- you want count only positive integers, so you have to filter them with:
+el>=0
- finally, as array size is limited to 2^32, you will to also filter positive integers greater than that:
+el < Math.pow(2,32)
Functionally, you will have your result with this filter:
Array.realLength= Object.keys(a).filter(function(el){return !(+el % 1) && +el>=0 && +el < Math.pow(2,32) ;}).length
TL;DR The simplest reliable approach that I can think of is the following:
var count = a.filter(function() { return true; }).length;
In modern JavaScript engines, this could be shortened to:
var count = a.filter(() => true).length;
Full answer:
Checking against undefined isn't enough because the array could actually contain undefined values.
Reliable ways to find the number of elements are...
Use the in operator:
var count = 0;
for (var i = 0; i < a.length; i += 1) {
if (i in a) {
count += 1;
}
}
use .forEach() (which basically uses in under the hood):
var a = [1, undefined, null, 7];
a[50] = undefined;
a[90] = 10;
var count = 0;
a.forEach(function () {
count += 1;
});
console.log(count); // 6
Run code snippetEdit code snippet Hide Results Copy to answer Expand
or use .filter() with a predicate that is always true:
var a = [1, undefined, null, 7];
a[50] = undefined;
a[90] = 10;
var count = a.filter(function () { return true; }).length;
console.log(count); // 6
Run code snippetEdit code snippet Hide Results Copy to answer Expand