javascript array associatif ET indexé?
peut un tableau en JS être associatif ET indexé?
J'aimerais être capable de rechercher un élément dans le tableau, de par sa position ou une valeur de clé..
possible?
- c'est assez vieux, mais vous pouvez utiliser l'Objet.les touches(array) pour obtenir les clés dans l'ordre
- Vous êtes un programmeur PHP 🙂
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de telles choses comme des tableaux associatifs en Javascript. Vous pouvez utiliser des objets littéraux, qui look comme des tableaux associatifs, mais ils ont des propriétés non ordonnée. Régulièrement les tableaux Javascript sont basés sur les index entiers, et ne peut pas être associative.
Par exemple, avec cet objet:
Vous pouvez accéder aux propriétés de l'objet, par exemple:
Et vous pouvez également effectuer une itération sur l'objet à l'aide de la
for...in
déclaration:Cependant, il n'existe pas de règle stricte de l'ordre de la propriété d'itération - deux itérations de votre objet littéral pourrait renvoyer les propriétés dans des ordres différents.
a[1]
est en train de direa['1']
.Après la lecture de la Définition de Wikipedia de tableau associatif, je vais rompre avec la traditionnelle JavaScript lore et de dire, "oui, le JavaScript n'ont de tableaux associatifs." Avec les tableaux JavaScript, vous pouvez ajouter, de réaffectation, de supprimer et de valeurs de recherche de par leurs clés (et les touches peuvent être cités à cordes), qui est ce que dit Wikipedia tableaux associatifs devraient être en mesure de le faire.
Cependant, vous semblez être de demander quelque chose de différent, si vous pouvez regarder la même valeur par l'index ou sur la touche. Ce n'est pas une exigence de tableaux associatifs (voir l'article de Wikipedia.) Tableaux associatifs n'avez pas à vous donner la possibilité d'obtenir une valeur par l'indice.
Les tableaux JavaScript sont très étroitement apparenté à des objets JavaScript.
Oui, c'est un tableau, et oui, vous pouvez vous en sortir avec les indices numériques. (Si vous êtes curieux, après tout cela, arr.la longueur est de 3.)
Dans la plupart des cas, je pense que vous devez vous en tenir à des indices numériques lorsque vous utilisez les tableaux. Que ce que la plupart des programmeurs attendre, je pense.
Le lien de mon blog sur le sujet.
.push()
.)Natif d'objets JS acceptons uniquement les chaînes que les noms de propriété, ce qui est vrai même pour les indices de tableau; les tableaux diffèrent de la vanille, des objets uniquement dans la mesure où la plupart des JS implémentations magasin indexé numériquement les propriétés différemment (c'est à dire dans un tableau réel, aussi longtemps qu'ils sont denses), et de déclencher des opérations supplémentaires (par exemple, le réglage de la
length
propriété).Si vous êtes à la recherche d'une carte qui accepte les clés arbitraires, vous aurez à utiliser un non-natifs de la mise en œuvre. Le script est prévu pour l'itération rapide et pas d'accès aléatoire par des indices numériques, de sorte qu'il pourrait ni être ce que vous cherchez.
Un barebones la mise en œuvre d'un plan qui permettrait de faire ce que vous proposez pourrait ressembler à ceci:
La
index
argument deput()
est facultatif.Vous pouvez accéder aux valeurs dans une carte
map
soit par clé ou l'indice de viamap.put('key','value')
pour ajouter de la valeur et demap.put('key','value', 42)
pour l'insertion d'une valeur à une position donnée;map[42].value = 'value'
permettra également de travailler (c'est à dire remplacer la valeur d'une clé existante-la valeur de la paire), mais vous ne pouvez pas modifier la clé ou l'indice de l'entrée ou ajouter de nouvelles entrées de cette façonL'ordre dans lequel les objets apparaissent dans un cadre associatif tableau javascript n'est pas défini, et diffèrent selon les différentes implémentations. Pour cette raison, vous ne pouvez pas vraiment compter sur une donnée clé associative pour être toujours au même indice.
EDIT:
comme Perspx le souligne, il n'y a pas vraiment de vrais tableaux associatifs en javascript. La déclaration
foo["bar"]
est juste sucre syntaxique pourfoo.bar
Si vous faites confiance au navigateur de maintenir l'ordre des éléments dans un objet, vous pouvez écrire une fonction
si vous souhaitez que le premier élément, alors vous pouvez l'utiliser comme ceci:
Je suis venu ici à vouloir savoir si c'est une mauvaise pratique ou pas, et au lieu trouvé beaucoup de personnes qui comparaissent pas à comprendre la question.
Je voulais avoir une structure de données qui a été ordonnée, mais pourrait être indexé par la clé, de sorte qu'elle ne nécessite pas d'itération pour chaque recherche.
En termes pratiques, cela est assez simple, mais je n'ai toujours pas lu quelque chose sur si c'est une terrible pratique ou pas.
La chose importante est de ne jamais modifier la valeur de tableau[index] ou tableau[key] directement une fois que l'objet ou les valeurs ne correspondent plus. Si le tableau contient des objets vous pouvez modifier les propriétés de ces objets et vous serez en mesure d'accéder à la modification des propriétés par la méthode.
aSignals[aSignals.length] = aSignals['fooBar'] = { 'sKey': 'foobBar', ... }
Bien que je suis d'accord avec les réponses que vous pouvez réellement accomplir ce que vous dites avec des getters et setters. Par exemple:
Est-ce ce que vous recherchez? je pense qu'il y a une autre manière plus moderne pour faire des getters et setters, mais ne me souviens pas.
La marée a changé sur ce point. Maintenant, vous pouvez faire cela... et PLUS encore! À l'aide de l'Harmonie proxy vous peut certainement résoudre ce problème de plusieurs façons.
Vous aurez à vérifier que vos environnements ciblés charge ce avec peut-être un peu d'aide de la harmonie-réfléchir cale.
Il y a un très bon exemple sur le Mozilla Developer Network sur l'utilisation d'un Proxy pour trouver un élément de tableau d'objets, de par leur propriété qui assez bien, il résume.
Voici ma version:
Oui.