Можно ли выбрать определенные элементы без перебора массива? - PullRequest
0 голосов
/ 11 января 2019

У меня есть массив объектов, каждый из которых имеет свойство :cow, установленное на false или true:

animals = [
  {
    id: 1,
    cow: true
  },
  {
    id: 2,
    cow: true
  },
  {
    id: 3,
    cow: true
  },
  {
    id: 4,
    cow: false
  },
  {
    id: 5,
    cow: false
  }
]

Мне нужно выбрать все члены массива, которые передают условие, не повторяя каждый элемент массива.

Возможно ли это?

Я пытался:

notCows = animals.reject { |a| !a[:cow] }
notCows = animals[0, 1, 2]

который не работает.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Нет, это невозможно. Чтобы найти все элементы, которые удовлетворяют определенному условию, вам нужно просмотреть все элементы, чтобы увидеть, удовлетворяют ли они этому условию. Логически просто невозможно найти все элементы коллекции, не просматривая все элементы коллекции.

0 голосов
/ 11 января 2019

Вы были почти там, используйте Enumerable#select (кстати, сканирует всех членов коллекции):

animals.select { |animal| animal[:cow] }
#=> [{:id=>1, :cow=>true}, {:id=>2, :cow=>true}, {:id=>3, :cow=>true}]

Или наоборот:

animals.select { |animal| !animal[:cow] }
#=> [{:id=>4, :cow=>false}, {:id=>5, :cow=>false}]

Возвращенные результаты - все еще объекты Ruby: массивы хэшей.


В качестве альтернативы вы можете группировать по статусу (Enumerable#group_by):

animals.group_by { |a| a[:cow] }
#=> {true=>[{:id=>1, :cow=>true}, {:id=>2, :cow=>true}, {:id=>3, :cow=>true}], false=>[{:id=>4, :cow=>false}, {:id=>5, :cow=>false}]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...