2017-02-17 2 views
1

У меня есть многомерный массив, как:рубин Извлечение массива из многомерного массива

arr1 = [["text1", 1], ["text2", 2], ["    text3", 3], ["    text4", 4], ["text5", 5], ["text6", 6], ["text7", 7]] 

и другой

arr2 = [2,3,6] 

Я хочу, чтобы извлечь весь массив, если он содержит элементы arr2. Таким образом, результат должен быть:

arr = [["text2", 2], ["    text3", 3], ["text6", 6]]. 

Я пробовал много способов, но не смог получить результат. Попытки такие как:

arr1.each { |elem| arr2.each { |x| elem.delete_if{ |u| elem.include?(x) } } } 

и

arr2.map { |x| arr1.map{|key, val| val.include?(x) }} 

Может кто-нибудь, пожалуйста, помогите?

ответ

0
arr1.inject([]) { |result, array| (array & arr2).any? ? result << array : result } 
#=> [["text2", 2], ["&nbsp;&nbsp;&nbsp;&nbsp;text3", 3], ["text6", 6]] 

Чуть короче и правильнее с точки зрения цели:

arr1.select { |array| (array & arr2).any? } 
+1

Почему бы не 'arr1.select {| a | (a & arr2) .any? } 'или' arr1.find_all {| a | (a & arr2) .any? } ', поскольку вы выбираете/находите вещи, а не более общую инъекцию/сокращение? –

+0

Выбор @muistooshort определенно лучше, чем создание нового массива (что я и сделал), я отредактирую ответ (раньше я этого не делал, потому что уже были предоставлены решения с 'select'). –

3

Попробуйте один

arr1.select { |a| a.any? { |item| arr2.include? item } } 
=> [["text2", 2], ["&nbsp;&nbsp;&nbsp;&nbsp;text3", 3], ["text6", 6]] 
+0

Я предпочитаю это или первый комментарий принятого ответа, как это более четко связан с тем, что пытается сделать код, то есть найти что-то. –

+0

Спасибо, сэр :) – Ursus

+0

абсолютно, должен быть принят, +1 –

1
arr1.select { |(_, d)| arr2.include? d } 
+1

Не очень общее решение - имея позиция целого числа в массиве, который изменил его, не сработает, а также изменит значение 'arr2', что сделает это решение недействительным :) PS Я знаю, что вы знаете –

+0

@ AndreyDeineko Я не уверен, что следую. Я считаю, что эти элементы сбрасываются с идентификаторами в 'arr1' и сами идентификаторы в' arr2'. Он также будет терпеть неудачу при неединственных нескольких значениях в 'arr2' и т. Д., Но по заявленному вопросу это решение достаточно устойчиво. – mudasobwa

+0

Что бы это ни было, вопрос/запрос: «Я хочу извлечь весь массив, если он содержит элементы arr2', которые ваше решение не удовлетворяет, учитывая, что входные данные слегка изменены. Несмотря на то, что с предоставленным экзаменационным вводом он ее решает. 'arr1 = [[1," text1 "], [2, 'text'], [5," text5 "], [6," text6 "], [7," text7 "]]', которые с вашим решением приведет к '[]', в то время как это должно привести к [[2, "text"], [6, "text6"]] ' –

Смежные вопросы