Найти индекс массива в многомерном массиве по строковому значению - PullRequest
1 голос
/ 10 июля 2019

Мне нужен индекс массива в многомерном массиве, если он содержит уникальную строку.

array:

[
    {:id=>5, :name=>"Leaf Green", :hex_value=>"047115"},
    {:id=>15, :name=>"Lemon Yellow", :hex_value=>"FFF600"},
    {:id=>16, :name=>"Navy", :hex_value=>"285974"}
]

Если существует hex_value для 'FFF600', вернуть позицию массива, который в этом случае будет 1.

Это то, где я нахожусь, но он возвращается [].

index = array.each_index.select{|i| array[i] == '#FFF600'}

1 Ответ

3 голосов
/ 10 июля 2019

Это возвращает nil, поскольку в массиве нет элемента i (индекс) со значением #FFF600 (ни FFF600), вам необходимо получить доступ к значению ключа hex_value:

p [
  {:id=>5, :name=>"Leaf Green", :hex_value=>"047115"},
  {:id=>15, :name=>"Lemon Yellow", :hex_value=>"FFF600"},
  {:id=>16, :name=>"Navy", :hex_value=>"285974"}
].yield_self { |this| this.each_index.select { |index| this[index][:hex_value] == 'FFF600' } }
# [1]

Давая вам [1], из-за использования select, если вы хотите только первое вхождение, вы можете использовать find вместо.

Я использую yield_self, чтобы избежать присвоения массива переменной. Что эквивалентно:

array = [
  {:id=>5, :name=>"Leaf Green", :hex_value=>"047115"},
  {:id=>15, :name=>"Lemon Yellow", :hex_value=>"FFF600"},
  {:id=>16, :name=>"Navy", :hex_value=>"285974"}
]
p array.each_index.select { |index| array[index][:hex_value] == 'FFF600' }
# [1]

Будучи Рубином, вы можете использовать метод для этого: Enumerable#find_index

p [
  {:id=>5, :name=>"Leaf Green", :hex_value=>"047115"},
  {:id=>15, :name=>"Lemon Yellow", :hex_value=>"FFF600"},
  {:id=>16, :name=>"Navy", :hex_value=>"285974"}
].find_index { |hash| hash[:hex_value] == 'FFF600' }
# 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...