Как проверить, содержит ли массив определенное значение? - PullRequest
0 голосов
/ 07 июля 2019

Я работаю с массивом в этой форме:

"car_documents_attributes"=>{
    "1562523330183"=>{
        "id"=>"", "filename"=>"tyYYqHeqSFOnqLHEz5lO_rc_tispor12756_6wldwu.pdf", "document_type"=>"contract"
    }, 
    "1562523353208"=>{
        "id"=>"", "filename"=>"a9P8TyECRiKbI2YdRVZy_rc_tispor12756_bbtzdz.pdf", "document_type"=>"request"
    },
     "1562523353496"=>{
        "id"=>"", "filename"=>"WCM5FHOfSw6yNSUrfPPm_rc_tispor12756_dqu9r2.pdf", "document_type"=>"notes"
    },
    ...
}

Мне нужно выяснить, есть ли в этом массиве элемент, где document_type = contract (может быть ни один, ни один, илинесколько единиц).

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

Есть ли лучший и более быстрый способ простопроверить, есть ли в массиве элемент с document_type = contract?

1 Ответ

2 голосов
/ 07 июля 2019

Это хеш, содержащий больше хешей. Что вы можете сделать, так это получить доступ к car_documents_attributes, выполнить итерацию этих хеш-значений и проверить, является ли какой-либо document_type «контрактным»:

data = {
  "car_documents_attributes" => {
    "1562523330183" => { "id" => "", "filename" => "tyYYqHeqSFOnqLHEz5lO_rc_tispor12756_6wldwu.pdf", "document_type" => "contract"},
    "1562523353208" => { "id" => "", "filename" => "a9P8TyECRiKbI2YdRVZy_rc_tispor12756_bbtzdz.pdf", "document_type" => "request" },
    "1562523353496" => { "id" => "", "filename" => "WCM5FHOfSw6yNSUrfPPm_rc_tispor12756_dqu9r2.pdf", "document_type" => "notes" }
  }
}
p data['car_documents_attributes'].any? { |_, doc| doc['document_type'] == 'contract' }
# true

Не знал, что это данные, поступающие из параметров. Если это так, вам нужно разрешить полученное или преобразовать параметры в небезопасный хеш.

Кроме того, вы можете попытаться использовать fetch вместо [] при попытке получить car_documents_attributes, потому что, если этот ключ отсутствует в data, он выдаст nil, что вызовет ошибку NoMethodError:

data.fetch('car_documents_attributes', []).any? { |_, doc| doc['document_type'] == 'contract' }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...