0
votes

Comment retourner tous les éléments du hachage en plus d'une première paire de clé / valeur

Je veux retourner tous les éléments dans un hachage à l'exclusion de la première paire de clé / valeur.

Mon expérience est limitée donc ce que j'utilise est .except car il est non destructeur. < / p> xxx


3 commentaires

Avec des rails, sauf devrait fonctionner.


@Sergitulentsev oh ok je ne savais pas que c'était seulement pour les rails. Merci!


Cela fait partie de ActiveSupport, ce qui signifie qu'il est présent dans les rails par défaut, mais d'autres applications peuvent l'utiliser si vous avez besoin d'ActiveSupport.


4 Réponses :


1
votes

h.except (: a) fonctionnerait avec des rails / ActiveSupport, mais cela nécessite de connaître le nom de la clé.

Adressage d'un premier élément est plus difficile, car le hachage, en tant que structure de données, n'a pas de commande pour des paires de clés. Mais de bonnes nouvelles est que, dans Ruby (ou au moins IRM / YARV), les hachages maintiennent l'ordre d'insertion et il est reflété lorsque vous ithéez les paires de la valeur clé. Donc, vous pourriez faire quelque chose comme ceci: xxx

ou, plus succinctly xxx


2 commentaires

... Mais vous connaissez le nom de la clé: h.first.first .


@CarySwoveland: h.except (h.first.first) est un solide Wtf-moment



4
votes

Notez que l'idée de "premier" pour un hachage est légèrement poisson. Il est vrai que hachage es dans RUBY est commandé par insertion, Ceci est garanti par la spécification , et vous pouvez donc compter sur lui dans chaque mise en œuvre sur chaque plate-forme, mais en général , le but d'un hachage est de rechercher des valeurs par les touches, pas comptez sur commande.

Par exemple, il y a aucune garantie que : A sera la première clé de votre exemple. Il dépend complètement de la manière dont le hachage a été créé et dans lequel commande les clés ont été ajoutées.

qui étant dit, il y a un énumérable méthode qui fait exactement ce que vous voulez: déposez le premier n éléments de un énumérable , et il est sans surprise nommé < Code> Enumérable # Drop .

Notez que, comme c'est une méthode énumérable , il ne connaît rien de hachage ES, la seule méthode à laquelle il connaît, c'est #each < / code> . Par conséquent, il retournera un tableau de tout ce que #each est des rendements, qui dans le cas d'un hachage est un élément de deux éléments [ Touche, valeur] paire: xxx

heureusement, il existe une méthode qui transforme un énumérable de la matrice de deux éléments s dans un hachage , nommément énumérable # to_h : xxx


0 commentaires

1
votes

Vous pouvez utiliser #Shift < / Code> avec # Tapez sur comme: xxx


1 commentaires

J'aime, mais c'est destructeur.



0
votes

Je n'aime pas l'idée de convertir le hachage en une matrice, de manipuler le tableau, puis de convertir le tableau modifié à un hachage, donc j'ai utilisé Hash # rejeter .

x = 1
h.reject { (x -= 1).zero? }
  #=> {:b=>2, :c=>3}


2 commentaires

C'est la plupart du temps pédannie, mais l'inconvénient de cette approche est qu'il itère sur chaque paire de valeur clé dans le hachage, même si vous savez que le bloc ne reviendra que de la vérité dans la première itération.


@Jordan, j'ai essayé d'éviter cela, mais je ne pouvais pas penser à une solution (non destructive) qui n'a pas énuméré toutes les paires de la valeur clé. Une manière ou une autre, toutes les solutions ne sont-elles pas toutes les solutions (y compris les conversions vers une matrice et d'un tableau de retour à un hachage). Avez-vous eu quelque chose en tête?