Как найти ключ последнего массива - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть хеш со значением массива:

some_attributes['variants']
# =>
# [
#   [["variantCode", "0715839001002"], ["sizeCode", "002"], ["sizeName", "XS"]],
#   [["variantCode", "0715839001003"], ["sizeCode", "003"], ["sizeName", "S"]],
#   [["variantCode", "0715839001004"], ["sizeCode", "004"], ["sizeName", "M"]],
#   [["variantCode", "0715839001005"], ["sizeCode", "005"], ["sizeName", "L"]]
# ]

Я ожидаю, что в новом массиве ключи каждого "sizeName":

['XS', 'S', 'M', 'L']

Я пытался вот так:

some_attributes['variants'[[['sizeName']]]]

some_attributes['variants'].select{|size| sizeName["sizeName"]}

Но я не могу найти решение.Какие-нибудь хитрости?

Ответы [ 4 ]

0 голосов
/ 28 декабря 2018

Просто для развлечения, другой вариант:

some_attributes["variants"].map(&:last).map(&:last)
#=> ["XS", "S", "M", "L"]

Также

some_attributes["variants"].transpose.last.transpose.last
#=> ["XS", "S", "M", "L"]

Или даже микс:

some_attributes["variants"].map(&:last).transpose.last
#=> ["XS", "S", "M", "L"]


Aбенчмарк опубликованных методов
require 'benchmark'
n = 5000
Benchmark.bm do |x|
  x.report("tiw_____") { n.times { some_attributes['variants'].map{|a| a[-1][1]} } }
  x.report("kimmo___") { n.times { some_attributes['variants'].map { |a| a.last.last } } }
  x.report("Aleksei1") { n.times { some_attributes['variants'].map { |(_, _), (_, _), (_, e)| e } } }
  x.report("igian1__") { n.times { some_attributes["variants"].map(&:last).map(&:last) } }
  x.report("igian3__") { n.times { some_attributes["variants"].map(&:last).transpose.last } }
  x.report("igian2__") { n.times { some_attributes["variants"].transpose.last.transpose.last } }
  x.report("Aleksei2") { n.times { some_attributes['variants'].map(&:flatten).map(&:last) } }
end

Один результат (результаты каждого прогона немного меняются):

#        user     system      total        real
# tiw_____  0.007577   0.000078   0.007655 (  0.007709)
# kimmo___  0.003979   0.000086   0.004065 (  0.004070)
# Aleksei1  0.008227   0.000158   0.008385 (  0.008542)
# igian1__  0.008080   0.000132   0.008212 (  0.008220)
# igian2__  0.011956   0.000168   0.012124 (  0.012571)
# igian3__  0.013975   0.000122   0.014097 (  0.014261)
# Aleksei2  0.054203   0.002921   0.057124 (  0.059449)
0 голосов
/ 28 декабря 2018

Похоже, вы могли бы превратить варианты в хэши.

some_attributes = {
  "variants" => [
    [["variantCode", "0715839001002"], ["sizeCode", "002"], ["sizeName", "XS"]],
    [["variantCode", "0715839001003"], ["sizeCode", "003"], ["sizeName", "S"]],
    [["variantCode", "0715839001004"], ["sizeCode", "004"], ["sizeName", "M"]],
    [["variantCode", "0715839001005"], ["sizeCode", "005"], ["sizeName", "L"]]
  ]
}

variants = some_attributes['variants'].map(&:to_h)
variants.map { |variant| variant['sizeName'] }
=> ["XS", "S", "M", "L"]

Тогда проще сделать что-то вроде:

large_variant = variants.find { |variant| variant['sizeName'] == 'L' }
puts large_variant['variantCode']
# outputs:
# 0715839001005

Или просто получить то, что вы хотели, просто:

some_attributes['variants'].map { |a| a.last.last }
#=> ["XS", "S", "M", "L"]
0 голосов
/ 28 декабря 2018

Просто из любопытства:

some_attributes['variants'].map { |(_, _), (_, _), (_, e)| e }
#⇒ ["XS", "S", "M", "L"]

some_attributes['variants'].map(&:flatten).map(&:last)
#⇒ ["XS", "S", "M", "L"]
0 голосов
/ 28 декабря 2018
some_attributes['variants'].map{|a| a[-1][1]}
#=> ["XS", "S", "M", "L"]

Где первый -1 - это индекс последнего элемента 1-го измерения.
А второй 1 - это просто второй индекс 2-го измерения,
- чтов этом случае фактически совпадает с другим -1 / последним индексом.

IE ниже действует одинаково:

some_attributes['variants'].map{|a| a[-1][-1]}
#=> ["XS", "S", "M", "L"]

Чтобы увеличить удобочитаемость:

some_attributes['variants'].map{|a| a.last.last}
#=> ["XS", "S", "M", "L"]

Мало того, что эта запись более интуитивна, но она также работает быстреепроверьте Тест iGian ниже :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...