Как отсортировать массив хэшей в рубине

У меня есть массив, каждый из элементов которого является хешем с тремя парами ключ/значение:

:phone => "2130001111", :zip => "12345", :city => "sometown"

Я хотел бы отсортировать данные с помощью zip, чтобы все phone в одной области были вместе. У Ruby есть простой способ сделать это? Может ли will_paginate разбивать данные в массиве?

Ответ 1

Simples:

array_of_hashes.sort_by { |hsh| hsh[:zip] }

Примечание:

При использовании sort_by вам нужно назначить результат новой переменной: array_of_hashes = array_of_hashes.sort_by{} иначе вы можете использовать метод "bang" для изменения: array_of_hashes.sort_by!{}

Ответ 2

sorted = dataarray.sort {|a,b| a[:zip] <=> b[:zip]}

Ответ 3

Если вы хотите разбивать страницы на данные в массиве, вы должны потребовать 'will_paginate/array' в вашем контроллере

Ответ 4

Используйте перерыв для изменения массива:

array_of_hashes.sort_by!(&:zip)

Или переустановите его:

array_of_hashes = array_of_hashes.sort_by(&:zip)

Обратите внимание, что метод sort_by будет сортироваться по возрастанию.

Если вам нужно сортировать по убыванию, вы можете сделать что-то вроде этого:

array_of_hashes.sort_by!(&:zip).reverse!

или

array_of_hashes = array_of_hashes.sort_by(&:zip).reverse

Ответ 5

nil не сопоставим, чтобы избежать встречи с ним

sorted = dataarray.sort do |a,b| 
  if a[:zip] == nil
    -1                       # nil gets to the start, swap if you need otherwise
  elsif b[:zip] == nil
     1
  else
    a[:zip] <=> b[:zip]
  end
end