0
votes

Dans Ruby, comment réorganisez-vous une gamme d'objets avec des touches d'identification, donnez-vous une nouvelle commande du tableau en tant que tableau?

J'ai un objet avec un tableau qui ressemble à ceci: xxx pré>

et j'ai une entrée d'un autre tableau que je souhaite réorganiser le tableau dans P>

target_order = [
  { id: "foo0", new_position: 3 },
  { id: "foo3", new_position: 0 },
  { id: "foo1", new_position: 2 },
  { id: "foo2", new_position: 1 }
]


6 commentaires

Pourquoi avez-vous deux NEW_POSITION: 3 ? Comment déterminez-vous si FOO2 ou FOO3 va d'abord?


Appelez Certains_Object [: certains_array] .sort_by! {...} et dans le bloc, renvoyez la valeur NEW_POSITION pour l'élément correspondant dans le tableau Target_Order .


La commande ciblera-t-elle toujours le même nombre d'éléments avec la même identifiant des touches que quelque_Object [: certains_array] ? Si oui, alors quelque_Object [: quelque_array] = cible_order.each_with_Object ([]) {| H, arr | arr [H [H [: NEW_POSITION]]] = H.slice (: ID)} semble assez simple


@Engineersmnky, après avoir posté une réponse, j'ai remarqué que c'est la même chose que la solution contenue dans votre commentaire, j'ai donc supprimé ma réponse et je vous dirige vers vous pour poster le vôtre. Je dois me rappeler Hash # Slice .


@CarySwoveland Je prends la direction de No Man :) Et sointez peu pour la réputation de répondre à une question ambiguë avec une réponse présomptive; Cependant, j'apprécie certainement votre geste vertueux et vous souhaite la bienvenue à rétablir votre réponse comme vous le voyez


@Engineersmnky, aye, aye, monsieur!


4 Réponses :


0
votes

Juste pour être simpliste, c'est ce que je ferais ... XXX


1 commentaires

Veuillez noter que cela suppose que la nouvelle commande_position n'est pas basée sur zéro.



1
votes

Je vous recommande d'utiliser trier_by code> avec un bloc personnalisé qui trouve la position de l'élément dans la nouvelle matrice.

new_array = target_order.each_with_object([]) do |order, memo|
  item = some_object[:some_array].detect { |item| item[:id] == order[:id] }
  next unless item

  memo[order[:new_position]] = item
end


0 commentaires

0
votes

S'il y a une correspondance d'une correspondance entre quelque_array code> et cible_order code> Eléments, vous pouvez peut-être faire une mission directe, quelque chose comme:

some_object #=> {:some_array=>[{:id=>"foo3"}, {:id=>"foo2"}, {:id=>"foo1"}, {:id=>"foo0"}]}


0 commentaires

0
votes

Il n'est pas nécessaire de trier, ce qui a une complexité du temps de O (n * journal (n)). Voici une solution O (n). xxx

Notez qu'il n'y a pas de référence à quelque_Object .

si si doit être modifié en place: xxx

en utilisant Enumérable # Sort_by , bien que moins efficace, on pourrait écrire: xxx


1 commentaires

Voir le commentaire de @ Engineersmnky sur la question.