2017-02-17 3 views
1

Ich habe ein mehrdimensionales Array, wie:Rubin Extract Array aus mehrdimensionales Array

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

und eine andere

arr2 = [2,3,6] 

Ich möchte gesamte Array extrahieren, wenn sie Elemente ARR2 enthält. So sollte, Ergebnis sein:

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

ich viele Möglichkeiten ausprobiert haben, aber nicht in der Lage das Ergebnis zu erhalten. Versuche, wie zum Beispiel:

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

und

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

Kann jemand bitte helfen?

Antwort

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

Etwas kürzer und korrektere vom Ziel Perspektive:

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

Warum nicht 'arr1.select {| a | (a & arr2) .alles? } 'oder' arr1.find_all {| a | (a & arr2) .alles? } 'da du Dinge auswählst/findest anstatt eine allgemeinere Injektion/Reduktion? –

+0

@muistooshort Auswahl ist definitiv besser als ein neues Array zu erstellen (was ich getan habe), ich werde die Antwort bearbeiten (ich habe das vorher nicht getan, weil Lösungen mit 'select' wurden bereits gegeben) .. –

3

Versuchen Sie dieses

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

Ich ziehe diese oder den ersten Kommentar der akzeptierte Antwort, wie es ist deutlicher mit dem zu tun, was der Code versucht, also etwas zu finden. –

+0

Danke Sir :) – Ursus

+0

absolut, sollte die angenommen werden, +1 –

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

Nicht sehr generische Lösung - mit Die Position von Integer in einem Array wurde geändert. Dies wird fehlschlagen, und die Änderung von 'arr2' wird diese Lösung ungültig machen. PS Ich weiß, Sie wissen –

+0

@AndreyDeineko Ich bin mir nicht sicher, ob ich folge. Ich glaube, das sind Elemente, die in "arr1" mit ids und in "arr2" mit ids versehen sind. Es wird auch bei nicht eindeutigen Mehrfachwerten in 'arr2' usw. fehlschlagen, aber für die angegebene Frage ist diese Lösung robust genug. – mudasobwa

+0

Was auch immer das ist, die Frage/Anfrage lautet: "Ich möchte das gesamte Array extrahieren, wenn es Elemente von arr2 enthält", was Ihrer Lösung nicht genügt, wenn die Eingabedaten geringfügig geändert werden. Auch wenn es mit dem zur Verfügung gestellten Beispiel-Input es löst. 'arr1 = [[1," text1 "], [2, 'text'], [5," text5 "], [6," text6 "], [7," text7]]] ', welches mit Ihrer Lösung führt zu '[]', während es zu '[[2," text "], [6," text6 "]]' führen sollte –