简体   繁体   中英

Find Array length in Javascript

This will sound a very silly question. How can we find the exact length of array in JavaScript; more precisely i want to find the total positions occupied in the array.

I have a simple scenario which i guess most of you might be aware of.

var a = [1,2,3];
a.length; //This will output 3

Now if i give

a[100] = 100;
a.length; // The output is 101; 

I want to get the exact size of the array which in the above case should be 4.

This will give you the number of elements really present in your array:

Object.keys(a).length

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array#Relationship_between_length_and_numerical_properties

edit

As pointed in comments by JLRishe, Object.keys(a).length returns the number of keys present in the object a. If I add a key like that:

a= [1,2,3];
a['key']= "akey";

then Object.keys(a).length will return 4

but "key" is not a part of the array, it's a property of the array Object, console.log(a) gives you [1,2,3].

So, to have a more reliable value of the number of elements in an array, we need to count only positive integer key values:

Object.keys(a).filter(function(el){return !(+el % 1) && +el>=0 && +el < Math.pow(2,32) ;}).length 

Object.keys returns an array of String. Assigning a value in an array with a['1'] or a[1] is equivalent. Array index keys have also to be less than 2^32.

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 

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 

the size of the array is exactly what is shown by the length property.

even though you gave a value only to the first 3 positions(0,1,2), when you gave the value 100 to the a[100], you resized it to 101 positions. Therefore, you'll get the count of every position, from 0(first index) to 100(last index), even if they have no value.

With your code: a[100] = 100 , you are creating a block at location 100 in your array. (Total of 101 since it starts at 0).

If you want to see how many actual answers are in the block you would have to use a loop and cycle through checking which fields are not equal to undefined. There are dozens of ways to do this with for , while , foreach , etc.

Just implement a counter and count the sections in the array that are not equal to null or undefined . That will give you the number of places that are actually being used in the array.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM