Как конвертировать массив хешей - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь преобразовать следующий массив хэшей:

data = [{
  k: [{id: 'abc'}, {id: 'bcd'}, {id: 'cde'}]
  o: [{id: 'ede'}, {id: 'qpl'}, {id: 'ged'}]
}]

в это:

#<Test:0x00005628978c1e30 @k=['abc', 'bcd', 'cde']>>

Я сделал это:

class Test
  def initialize(sample)
    sample.each do |k, v|
      self.instance_variable_set("@#{k}", v.is_a?(Array) ? Test.new(v.map do |v| v[:id] end) : v)
    end
  end
end

test = Test.new(data)
# => #<Test:0x00005628978c1e30 @k=#<Test:0x00005628978c1d90 @abc=nil, @bcd=nil, @cde=nil>>

Ятакже пытается преобразовать хэш (с комментариями в данных) в нечто вроде этого:

#<Test:0x00005628978c1e30 @k=['abc', 'bcd', 'cde'] @o=#<Test:0x00005628978c1e31 @b=['ede', 'qpl'], @id='teq' >>

Кто-нибудь знает, как мне этого добиться?

1 Ответ

0 голосов
/ 30 сентября 2018

Учитывая

data = [{
  k: [{id: 'abc'}, {id: 'bcd'}, {id: 'cde'}],
  o: [{id: 'ede'}, {id: 'qpl'}, {id: 'ged'}]
}]

, вы спросили, можно ли создать следующий экземпляр класса Test (# в начале не показан, и я вставил запятую в конце второй строки):

<Test:0x00005628978c1e30 @k=['abc', 'bcd', 'cde']
  @o=#<Test:0x00005628978c1e31 @b=['ede', 'qpl'],
  @id='teq' >>

Это выглядит странным запросом, но это можно сделать следующим образом.

class Test
end

t = Test.new
  #=> #<Test:0x0000000001eb9c58>
t.instance_variable_set("@b", data.first[:o][0,2].flat_map(&:values))
  #=> ["ede", "qpl"]
t
  #=> #<Test:0x0000000001eb9c58 @b=["ede", "qpl"]>
t.instance_variable_set("@id", 'teq')
  #=> "teq"
t.instance_variables
  #=> [:@b, :@id]
t
  #=> #<Test:0x0000000001eb9c58 @b=["ede", "qpl"], @id="teq">

test = Test.new
  #=> #<Test:0x0000000001e9ad58>
test.instance_variable_set("@k", data.first[:k].flat_map(&:values))
  #=> ["abc", "bcd", "cde"]
test
  #=> #<Test:0x0000000001e9ad58 @k=["abc", "bcd", "cde"]>
test.instance_variable_set("@o", t) 
  #=> #<Test:0x0000000001eb9c58 @b=["ede", "qpl"], @id="teq">
test.instance_variables
  #=> [:@k, :@o]
test
  #=> #<Test:0x0000000001e9ad58 @k=["abc", "bcd", "cde"],
  #     @o=#<Test:0x0000000001eb9c58 @b=["ede", "qpl"], @id="teq">>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...