Tableau.longueur donne la longueur incorrecte
Si j'ai un tableau ayant comme objet des valeurs des indices tels que:
var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
alert(a.length); //outputs 91
J'ai trouvé une solution de contournement pour obtenir la longueur réelle:
function getLength(arr) {
return Object.keys(arr).length;
}
var a = [];
a[21] = {};
a[90] = {};
a[13] = {};
alert(getLength(a));
Mais, pourquoi est-JS donne la longueur incorrecte lorsque les objets sont stockés au hasard des indices? Il ajoute juste 1 pour le plus grand indice trouvé sur un tableau. Comme dans l'exemple ci-dessus, 90 a été le plus grand index. Il ajoute juste 1 et donne 91 en sortie. Démonstration
- Le comportement que vous décrivez est ce qui est défini dans l'officiel de la spec. ecma-international.org/ecma-262/5.1/#sec-15.4.5.2
- La question est: Pourquoi avez-vous des hypothèses incorrectes sur
.length
? Imaginez.length
retourné3
et vous avez essayé d'utiliserfor
boucle pour obtenir les valeurs. Vous n'auriez jamais les valeurs... - Merci. Ne savais pas que officiel spec comme cela existait! Je vais toujours vous référer à maintenant.
- Je ne pouvais pas comprendre ce que vous avez dit. Je ne suis pas bonne en anglais 😛 j'ai besoin de tels indices, parce qu'ils ont facilité beaucoup dans mon script. Je pensais trouver un correctif pour
.length
serait bon. Tout le reste fonctionne très bien. - Eh bien, ça sonnait comme prévu
.length
pour renvoyer une valeur différente, sans doute3
. Mais si il est retourné3
et vous parcourir le tableau avecfor (var i = 0; i < arr.length; i++)
et aurait accèsarr[i]
, qui seraitarr[0]
, etc, alors vous ne serait pas obtenir les valeurs correctes. - De toute façon, il semble que ce que vous voulez est en fait un objet (
var a = {}
), pas un tableau. - la version officielle est maintenant ed 6. 😉
- Je vais avoir un moment difficile de trouver de Tableau.longueur de la documentation là-bas..... 😮
- dans §22.1.4 Propriétés des Instances d'Array.
- ahh façon, là-bas... lil javascript spec est en train de grandir :')
- Avec ed 5 ECMA semblent avoir conservé autant que possible de la numérotation à partir de l'ed 3, mais cela signifiait que certaines sections étaient juste des références à d'autres sections, et le truc n'est pas nécessairement dans un ordre logique. Avec ed 6 ils semblent avoir mordu la balle, tout remettre dans l'ordre et renumérotés.
- Je dois admettre que j'ai été surpris lorsque j'ai été confronté à ce problème , mais alors il est logique , les Tableaux Javascript sont juste des objets 🙂
- ce qu'est un commentaire inutile. Inutilement agressif. Tu n'es pas en position de diriger les gens vers l'apprentissage des choses quand vous demandez à propos aligne verticalement divs.
Vous devez vous connecter pour publier un commentaire.
C'est parce que
length
vous donne la prochaineindex
disponibles dans le tableau.DOCS
arrayLength
Spécifications ECMA
Parce que vous n'avez pas inséré de n'importe quel élément dans les autres touches de 21, 90, 13, tout le reste de l'index contient
undefined
. DÉMOPour obtenir le nombre réel d'éléments dans le tableau:
JS:
Version plus courte
JS:
DÉMO
MODIFIER
Si le tableau contient un grand nombre d'éléments, en boucle pour obtenir sa longueur n'est pas le meilleur choix.
Comme vous l'avez mentionné dans la question,
Object.keys(arr).length
est la meilleure solution dans ce cas, en considérant que vous n'avez pas de propriétés ajoutées sur ce tableau. Sinon, lelength
ne sera pas ce que vous pourriez attendre.(Merci À @RobG)a[2020] = {}
? Je pense que la boucle à travers tout le tableau n'est pas assez bonne. Je m'en tiendrai à ma méthode pour l'instant jusqu'à ce que quelqu'un d'autre arrive avec une belle solution. IDK comment rapide estObject.keys
mais il sera plus rapide que la boucle atleast.a.length
est 0, maisObject.keys(a).length
est 1.delete
mot-clé à supprimer des éléments d'un tableau. Envisager l'utilisation de splice() ou pop() à la place.Le tableau en JavaScript est une simple base zéro de la structure. Le
array.length
renvoie lan + 1
oùn
est le maximum de l'indice dans un tableau.C'est juste la façon dont il fonctionne - lorsque vous affectez 90 ième élément et cette longueur du tableau est inférieur à 90, il développe une matrice à 90 et définit la 90-ème valeur de l'élément. Toutes les valeurs manquantes sont interprétés comme
null
.Si vous essayez le code suivant:
Vous obtiendrez le JSON suivants:
En outre,
array.length
n'est pas en lecture seule valeur.Si vous définissez un
length
valeur moins que le courant, alors la matrice sera redimensionnée:Si vous définissez un
length
valeur plus que le courant, alors la matrice sera élargi ainsi:Dans le cas où vous avez besoin d'attribuer ces valeurs, vous pouvez utiliser des objets JS.
Vous pouvez les utiliser en tant que tableau associatif et d'assigner toutes les paires clé-valeur.
Parce que c'est le comportement de la Matrice.la longueur comme décrit dans la ECMAScript spec.
Sorte De Tableau.la longueur est toujours le dernier élément de l'indice + 1.
C'est parce que vous avez un[90] comme le plus grand index de sorte que l'indice est de 0 à 90 devient 91 en longueur.
Et où vous n'avez pas transmettre les valeurs comme un[80], etc. javascript, de les stocker sous forme de trou c'est à dire, par exemple
[1, , 3, , ,90]
où les virgules sont utilisés indique le trou dans la gamme.Si vous essayez d'accéder à ces valeurs-là, vous aurez
undefined
.