J'ai un objet avec un tableau qui ressemble à ceci: 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 }
]
4 Réponses :
Juste pour être simpliste, c'est ce que je ferais ...
Veuillez noter que cela suppose que la nouvelle commande_position n'est pas basée sur zéro.
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
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"}]}
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). Notez qu'il n'y a pas de référence à si en utilisant Enumérable # Sort_by , bien que moins efficace, on pourrait écrire: p> quelque_Object code>. p> si code> doit être modifié en place: p>
Voir le commentaire de @ Engineersmnky sur la question.
Pourquoi avez-vous deux
NEW_POSITION: 3 CODE>? Comment déterminez-vous siFOO2 code> ouFOO3 code> va d'abord?Appelez
Certains_Object [: certains_array] .sort_by! {...} code> et dans le bloc, renvoyez la valeurNEW_POSITION CODE> pour l'élément correspondant dans le tableau code> Target_Order CODE>.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] code>? Si oui, alorsquelque_Object [: quelque_array] = cible_order.each_with_Object ([]) {| H, arr | arr [H [H [: NEW_POSITION]]] = H.slice (: ID)} code> 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 Code>.@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!