проблемы с простой сортировкой хешей в массиве игнорируются - PullRequest
0 голосов
/ 04 марта 2012

У меня есть простой массив

my_array = [{id:1,priority_score:2},{id:3,priority_score:5},{id:4,priority_score:3.5}...]

Я пытаюсь отсортировать по приоритету с

sort_array = my_array.sort_by{|priority| priority[:priority_score]}

странно, я не получаю никаких отличий от моего исходного массива.

Я создаю оценку приоритета, используя

new_hash = {id:h.id,priority_score:(a.score+b.score)/2}

и добавили все виды .to_f, .to_i на случай, если проблема заключалась в том, что оценка приоритета не распознавалась как число, но это не проблема.

Есть предложения?

Ответы [ 3 ]

1 голос
/ 04 марта 2012

вы можете использовать sort_by вот так.

my_array.sort_by {|(h, _)| h[:priority_score]}
# [{:id=>1, :priority_score=>2}, {:id=>4, :priority_score=>3.5}, {:id=>3, :priority_score=>5}]
1 голос
/ 04 марта 2012

Сортировка получает два элемента, и сортировка выполняется по результатам сравнения этих элементов.

Это сравнение должно возвращать -1, 0, 1.

0 для равных, -1 первое <второе и +1 первое> второе.

В большинстве случаев вы можете использовать встроенную функцию ruby ​​<=>

Например:

my_array = [{id:1,priority_score:2},{id:3,priority_score:5},{id:4,priority_score:3.5}]

# Sort ascending  
cr = my_array.sort {|a,b| a[:priority_score] <=> b[:priority_score]}
#[{:id=>1, :priority_score=>2}, {:id=>4, :priority_score=>3.5}, {:id=>3, :priority_score=>5}]

# Sort descending
de = my_array.sort {|a,b| b[:priority_score] <=> a[:priority_score]}
#[{:id=>3, :priority_score=>5}, {:id=>4, :priority_score=>3.5}, {:id=>1, :priority_score=>2}]
1 голос
/ 04 марта 2012

Метод Array#sort принимает блок с двумя аргументами a и b и хочет, чтобы вы сравнили их вручную. Учитывая то, как вы его вызываете, я думаю, что вы хотели sort_by, который принимает блок с каждым элементом в массиве, выполняет некоторое преобразование и сортирует по результату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...