Как я могу проверить, существует ли значение в массиве? - PullRequest
0 голосов
/ 01 ноября 2019

Я создаю веб-страницу статуса в rails, и у меня небольшая проблема.

Я хочу проверить, содержит ли массив «status: false». И если это правда, то появляется тревога опасности.

У меня уже есть решение, но я знаю, что оно должно идти с более «тонким» кодом. Это то, что уже работает:

checkresults.map { |c| c.status }.include?(false)
=> true

это ввод контрольных результатов

checkresults = [Checkresult.new(status: false), Checkresult.new(status: true)

то, что я пробовал, было

checkresults.include?(status: false)

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

Как это может работать с использованием только одного метода для массива?

Ответы [ 5 ]

3 голосов
/ 01 ноября 2019

Вы можете использовать any?:

checkresults.any? { |r| !r.status }

Это вернет вам true или false.

2 голосов
/ 01 ноября 2019

Вы можете использовать:

checkresults.map(&:status).include?(false)

Что ничего не меняет в вашем текущем коде, кроме используемых обозначений. Однако это не самое быстрое решение. Так как вам придется перебирать весь массив, отображая текущий элемент в его статус. Затем следует проверить, включено ли значение false в массив.

Ответы, использующие all?, any? или none?, замыкаются накоротко и прекращают итерацию, как только условие не выполняется (в случаеall? или none?) или как только условие выполнено (в случае any?).

1 голос
/ 01 ноября 2019

Вы можете использовать Enumerable # any? или Enumerable # all?

# sample: any?
[true, true].any? { |flag| flag == false } #=> false
[true, false].any? { |flag| flag == false } #=> true

# sample: all?
[true, true].all? { |flag| flag == true } #=> true
[true, false].all? { |flag| flag == true } #=> false

Вы можете использовать любой из них

check_results.any? { |flag| flag == false }
!check_results.all? { |flag| flag == false }

Давайте проверим

class CheckResult
  attr_reader :status

  def initialize(status: flag)
    @status = status
  end
end

# expect_true
check_results = [CheckResult.new(status: false), CheckResult.new(status: true)]
check_results.any? { |result| result.status == false } #=> true 
!check_results.all? { |result| result.status == true } #=> true

# expect_false
check_results = [CheckResult.new(status: true), CheckResult.new(status: true)]
check_results.any? { |result| result.status == false } #=> false
!check_results.all? { |result| result.status == true } #=> false

# shorthands
check_results = [CheckResult.new(status: false), CheckResult.new(status: true)]
!check_results.all? { |result| result.status == true } #=> true
!check_results.all?(&:status) #=> true
0 голосов
/ 01 ноября 2019

Incase, если вы хотите проверить один больше столбцов атрибутов. Вы можете использовать Pluck.

Используйте # pluck в качестве ярлыка для выбора одного или нескольких атрибутов без загрузкикуча записей только для того, чтобы получить нужные атрибуты.

CheckResult.pluck(:status1, status2).include?(false)

, отметив, что оба столбца вернут true или false.

0 голосов
/ 01 ноября 2019

В случае контрольных результатов объекты отвечают на status:

!checkresults.all?(&:status)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...