Ich habe eine Reihe von Hashes:
a=[{ 'foo'=>0,'bar'=>1 },
{ 'foo'=>0,'bar'=>2 },
... ]
Ich möchte das Array zuerst nach dem 'foo' jedes Hashs und dann nach 'bar' sortieren. Google sagt mir, dass es so gemacht wird:
a.sort_by {|h| [ h['foo'],h['bar'] ]}
Dies gibt mir jedoch den ArgumentError "Vergleich von Array mit Array fehlgeschlagen". Was bedeutet das?
Antworten:
a.sort { |a, b| [a['foo'], a['bar']] <=> [b['foo'], b['bar']] }
quelle
Enumerable#sort_by(&block)
ist grobsort { |a,b| block.call(a) <=> block.call(b) }
, außer auf effizientere Weise getan. Wenn dies funktioniert,sort_by
aber nicht funktioniert, stimmt etwas anderes nicht.a=[{'foo'=>0,'bar'=>2},{'foo'=>0,'bar'=>1},{'foo'=>2,'bar'=>1},{'foo'=>1,'bar'=>0}]
.Dies bedeutet wahrscheinlich, dass Sie eines der Felder "foo" oder "bar" in einem Ihrer Objekte vermissen.
Der Vergleich kommt nach unten , um so etwas wie
nil <=> 2
, die Renditennil
(anstelle von-1
,0
oder1
) und#sort_by
weiß nicht , wie zu handhabennil
.Versuche dies:
a.sort_by {|h| [ h['foo'].to_i, h['bar'].to_i ]}
quelle
Was Sie gepostet haben, funktioniert in Ruby 1.8.7:
ruby-1.8.7-p302 > a = [{'foo'=>99,'bar'=>1},{'foo'=>0,'bar'=>2}] => [{"foo"=>99, "bar"=>1}, {"foo"=>0, "bar"=>2}] ruby-1.8.7-p302 > a.sort_by{ |h| [h['foo'],h['bar']] } => [{"foo"=>0, "bar"=>2}, {"foo"=>99, "bar"=>1}] ruby-1.8.7-p302 > a.sort_by{ |h| [h['bar'],h['foo']] } => [{"foo"=>99, "bar"=>1}, {"foo"=>0, "bar"=>2}]
quelle
Diese Ausnahme tritt auf, wenn das für den Vergleich verwendete Ergebnisarray sowohl Null- als auch Nicht-Null-Werte enthält.
quelle
Dieser Fehler tritt auf, wenn Sie instabile Schlüssel haben und versuchen, nach diesen zu sortieren. Beispiel:
[{'foo'=>99,'bar'=>1},{'foo'=>0,'bar'=>2, 'qwe' => 7}] a.sort_by{|v| v['qwe']} ArgumentError: comparison of NilClass with 7 failed
Versuche es
a.sort_by{|v| [v['qwe']].select{|k| not k.nil?}}
Aber es funktioniert nicht für mich in
[v['index'],v['count'],v['digit'],v['value']]
wo die Ziffer instabil ist
quelle
Dies bedeutet (zumindest in meinem Fall), dass die Arten von Array-Elementen unterschiedlich sind. Als ich sicherstellte, dass alle Array-Elemente gleichzeitig sind (
Integer
zum Beispiel), begann die Sortierung zu funktionieren.quelle
Ziehen Sie in Betracht, das Array zu komprimieren (keine Einträge zu entfernen) und als Bonus, wenn es sich um einen Zeichenfolgenvergleich handelt, die Werte für die Sortierung ohne Berücksichtigung der Groß- und Kleinschreibung in Kleinbuchstaben zu schreiben.
a.compact.sort_by { |h| [h['foo'].downcase, h['bar'].downcase] }
quelle