This article is in my basic Ruby series. Basic, so only very basic knowledge for new friends to Ruby. This article I would like to mention to you about arrays.
Array is probably the most common data structure you will use in Ruby. They allow you to group data together into a list of elements.
Array elements don’t need to be the same type, they can be anything, even other arrays if you want.
Array in Ruby inherits from Object and it includes the Enumerable module (you can read more about Enumerable through your other posts here )
Initialize an array
Here is an example of an array:
1 2 | <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token string">"a"</span> <span class="token punctuation">,</span> <span class="token symbol">:b</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token punctuation">,</span> <span class="token builtin">String</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">,</span> <span class="token keyword">nil</span> <span class="token punctuation">]</span> |
You can also initialize an array with the new
method. It may have the original size and default object. If you do not specify any arguments, it will create an empty array.
1 2 3 4 | <span class="token builtin">Array</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token symbol">:a</span> <span class="token punctuation">)</span> <span class="token comment"># => [:a, :a]</span> <span class="token builtin">Array</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token comment"># => []</span> <span class="token builtin">Array</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token comment"># => [nil, nil, nil] </span> |
The second argument in Array.new
is used to fill the array with reference to that object.
1 2 3 4 | my_array <span class="token operator">=</span> <span class="token builtin">Array</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token symbol">:a</span> <span class="token punctuation">)</span> my_array <span class="token punctuation">.</span> first <span class="token punctuation">.</span> object_id <span class="token comment"># => 751068</span> my_array <span class="token punctuation">.</span> last <span class="token punctuation">.</span> object_id <span class="token comment"># => 751068</span> |
If you want to initialize the array with separate objects, you need to pass it a block.
1 2 | <span class="token builtin">Array</span> <span class="token punctuation">.</span> <span class="token keyword">new</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token operator">|</span> e <span class="token operator">|</span> e <span class="token operator">+</span> <span class="token number">4</span> <span class="token punctuation">}</span> <span class="token comment"># => [4, 5, 6]</span> |
And the last way you can initialize the array is to use the Kernel.Array()
method (or simply Array()
) and pass the object in.
1 2 3 4 | <span class="token function">Array</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token comment"># => [1]</span> <span class="token function">Array</span> <span class="token punctuation">(</span> <span class="token string">"a"</span> <span class="token punctuation">)</span> <span class="token comment"># => ["a"]</span> <span class="token function">Array</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token string">"a"</span> <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token string">"b"</span> <span class="token punctuation">:</span> <span class="token number">2</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token comment"># => [[:a, 1], [:b, 2]]</span> |
As usual, we often use the declaration as on the first example of the article
1 2 | arr <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token string">"a"</span> <span class="token punctuation">]</span> |
Accessing elements in arrays
Unlike key access hashes , we access the element in the array through its position. In arrays, the elements are numbered from 0.
You can use the []
, slice
, at
methods with the position of an element in an array to access that element.
Negative indicators will be accessed from the bottom. In addition, there is a first
method to access the first element, last
to access the last element of the array.
1 2 3 4 5 6 7 8 9 | my_array <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token string">"z"</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token string">"a"</span> <span class="token punctuation">,</span> <span class="token symbol">:b</span> <span class="token punctuation">,</span> <span class="token punctuation">[</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token punctuation">]</span> my_array <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token comment"># => "z"</span> my_array <span class="token punctuation">.</span> first <span class="token comment"># => "z"</span> my_array <span class="token punctuation">.</span> <span class="token function">at</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token comment"># => 2</span> my_array <span class="token punctuation">.</span> <span class="token function">slice</span> <span class="token punctuation">(</span> <span class="token number">2</span> <span class="token punctuation">)</span> <span class="token comment"># => "a"</span> my_array <span class="token punctuation">[</span> <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token comment"># => [3, 4]</span> my_array <span class="token punctuation">.</span> last <span class="token comment"># => [3, 4]</span> |
Another way is to use fetch
method with the argument is the position of the element in the array. Using fetch
different ways in the above it will return an error that no element array with the order passed, the other method returns nil
.
1 2 3 4 5 6 7 8 9 10 | my_array <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token symbol">:a</span> <span class="token punctuation">,</span> <span class="token symbol">:b</span> <span class="token punctuation">]</span> my_array <span class="token punctuation">.</span> <span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token comment"># => :b</span> my_array <span class="token punctuation">.</span> <span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token number">4</span> <span class="token punctuation">)</span> <span class="token comment"># => IndexError (index 4 outside of array bounds: -2...2)</span> my_array <span class="token punctuation">.</span> <span class="token function">fetch</span> <span class="token punctuation">(</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token string">"Don't go beyond <span class="token interpolation"><span class="token delimiter tag">#{</span> my_array <span class="token punctuation">.</span> size <span class="token operator">-</span> <span class="token number">1</span> <span class="token delimiter tag">}</span></span> "</span> <span class="token punctuation">)</span> <span class="token comment"># => "Don't go beyond 1"</span> my_array <span class="token punctuation">[</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token comment">#=> nil</span> |
How to retrieve multiple elements
The above only mentions that only one element can be removed at a time. See how to retrieve multiple elements in the array.
You can use how to specify the start and end index, or the range of the index, for example:
1 2 3 4 5 6 | my_array <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">,</span> <span class="token number">6</span> <span class="token punctuation">]</span> my_array <span class="token punctuation">[</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token comment"># => [3, 4]</span> my_array <span class="token punctuation">[</span> <span class="token number">0.</span> <span class="token number">.1</span> <span class="token punctuation">]</span> <span class="token comment"># => [1, 2]</span> my_array <span class="token punctuation">[</span> <span class="token number">2.</span> <span class="token punctuation">.</span> <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token comment"># => [3, 4, 5, 6]</span> |
The take
method with arguments is used to retrieve the first number of elements. If you want to get the first 3 elements, you just need to call take(3)
as follows:
1 2 | <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">take</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token comment"># => [1, 2, 3]</span> |
Similarly, you can retrieve a final number of array elements by removing the first few elements, using the drop
method.
1 2 3 4 | my_array <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">]</span> my_array <span class="token punctuation">.</span> <span class="token function">drop</span> <span class="token punctuation">(</span> <span class="token number">2</span> <span class="token punctuation">)</span> <span class="token comment"># => [3, 4, 5] </span> my_array <span class="token comment"># => [1, 2, 3, 4, 5]</span> |
Check if the value exists
The first and most obvious is to see if an element exists at a specific index. And you already know how to do that.
1 2 3 4 | <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token keyword">nil</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">slice</span> <span class="token punctuation">(</span> <span class="token number">0</span> <span class="token punctuation">)</span> <span class="token comment"># => 1</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token keyword">nil</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">slice</span> <span class="token punctuation">(</span> <span class="token number">5</span> <span class="token punctuation">)</span> <span class="token comment"># => nil</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token keyword">nil</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">slice</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token comment"># => nil</span> |
As seen above, doing this with an array with nil
element will cause a bit of misunderstanding.
If you want to check if the array contains an element with a specific value, you can use the any?
method any?
or include?
as follows.
1 2 3 4 5 6 | <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> any <span class="token operator">?</span> <span class="token punctuation">{</span> <span class="token operator">|</span> n <span class="token operator">|</span> n <span class="token operator">==</span> <span class="token number">3</span> <span class="token punctuation">}</span> <span class="token comment"># => true</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> any <span class="token operator">?</span> <span class="token punctuation">{</span> <span class="token operator">|</span> n <span class="token operator">|</span> n <span class="token operator">==</span> <span class="token number">4</span> <span class="token punctuation">}</span> <span class="token comment"># => false</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> include <span class="token operator">?</span> <span class="token punctuation">(</span> <span class="token number">1</span> <span class="token punctuation">)</span> <span class="token comment"># => true</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> include <span class="token operator">?</span> <span class="token punctuation">(</span> <span class="token number">4</span> <span class="token punctuation">)</span> <span class="token comment"># => false</span> |
When you want to return the result that the value is checking or the index of that element, for example, to find the element with the first letter is d
, we can use the find
or find_index
method as follows:
1 2 3 4 | <span class="token punctuation">[</span> <span class="token string">"abc"</span> <span class="token punctuation">,</span> <span class="token string">"bcd"</span> <span class="token punctuation">,</span> <span class="token string">"dfg"</span> <span class="token punctuation">,</span> <span class="token string">"ghk"</span> <span class="token punctuation">,</span> <span class="token string">"dd"</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> find <span class="token punctuation">{</span> <span class="token operator">|</span> e <span class="token operator">|</span> e <span class="token operator">=</span> <span class="token operator">~</span> <span class="token regex">/^d.*/</span> <span class="token punctuation">}</span> <span class="token comment"># => "dfg"</span> <span class="token punctuation">[</span> <span class="token string">"abc"</span> <span class="token punctuation">,</span> <span class="token string">"bcd"</span> <span class="token punctuation">,</span> <span class="token string">"dfg"</span> <span class="token punctuation">,</span> <span class="token string">"ghk"</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> find_index <span class="token punctuation">{</span> <span class="token operator">|</span> e <span class="token operator">|</span> e <span class="token operator">=</span> <span class="token operator">~</span> <span class="token regex">/^d.*/</span> <span class="token punctuation">}</span> <span class="token comment"># => 2</span> |
Notice here that the find
and find_index
method will return the first element in the array of conditions.
Calculate the sum of the array of numbers
You have 2 ways to do this and which method to choose depends on the context. The simplest way is with sum
.
1 2 | <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> sum <span class="token comment"># => 6</span> |
Note that if the element is a string, sum
still work when you pass the argument to it as follows:
1 2 | <span class="token punctuation">[</span> <span class="token string">"a"</span> <span class="token punctuation">,</span> <span class="token string">"b"</span> <span class="token punctuation">,</span> <span class="token string">"c"</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">sum</span> <span class="token punctuation">(</span> <span class="token string">""</span> <span class="token punctuation">)</span> <span class="token comment"># => "abc"</span> |
The other way is to use inject
or reduce
(these two methods just define different names, and the implementation is the same, some versions of Ruby will recommend using reduce
).
1 2 3 4 5 | <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">inject</span> <span class="token punctuation">(</span> <span class="token punctuation">:</span> <span class="token operator">+</span> <span class="token punctuation">)</span> <span class="token comment"># => 6</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> inject <span class="token punctuation">{</span> <span class="token operator">|</span> sum <span class="token punctuation">,</span> n <span class="token operator">|</span> sum <span class="token operator">+</span> n <span class="token punctuation">}</span> <span class="token comment"># => 6</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">reduce</span> <span class="token punctuation">(</span> <span class="token punctuation">:</span> <span class="token operator">+</span> <span class="token punctuation">)</span> <span class="token comment"># => 6</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> reduce <span class="token punctuation">{</span> <span class="token operator">|</span> sum <span class="token punctuation">,</span> n <span class="token operator">|</span> sum <span class="token operator">+</span> n <span class="token punctuation">}</span> <span class="token comment"># => 6</span> |
Randomly retrieve element
The simplest is that you use the sample
method to randomly retrieve 1 or more elements in the array, as in the following example:
1 2 3 | <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">,</span> <span class="token number">6</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> sample <span class="token comment"># => 4</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token number">5</span> <span class="token punctuation">,</span> <span class="token number">6</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">sample</span> <span class="token punctuation">(</span> <span class="token number">3</span> <span class="token punctuation">)</span> <span class="token comment"># => [2, 1, 4]</span> |
Delete the duplicate elements
Ruby provides us with the uniq
method – which returns the new array after removing the duplicates.
1 2 3 | <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> uniq <span class="token comment"># => [1, 2, 3]</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> uniq <span class="token comment"># => [1, 2, 4, 3] </span> |
Arrange the array
We will use sort
method – default sort in ascending order. Or you can pass a block to the sort
method to show how we compare the two elements in the array to rearrange the array. If you want to sort your descending array, you can do the following:
1 2 | <span class="token punctuation">[</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> sort <span class="token punctuation">{</span> <span class="token operator">|</span> a <span class="token punctuation">,</span> b <span class="token operator">|</span> b <span class="token operator"><=</span> <span class="token operator">></span> a <span class="token punctuation">}</span> <span class="token comment"># => [4, 3, 2]</span> |
Or you can combine regular and reverse
sort
as follows:
1 2 | <span class="token punctuation">[</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> sort <span class="token punctuation">.</span> reverse <span class="token comment"># => [4, 3, 2]</span> |
Also, when dealing with more complex data, you can use the sort_by
method to get a better effect.
1 2 3 4 5 6 | names <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">"John"</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">10</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">"Jane"</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">12</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token string">"Bill"</span> <span class="token punctuation">,</span> age <span class="token punctuation">:</span> <span class="token number">13</span> <span class="token punctuation">}</span> <span class="token punctuation">]</span> names <span class="token punctuation">.</span> sort_by <span class="token punctuation">{</span> <span class="token operator">|</span> h <span class="token operator">|</span> h <span class="token punctuation">[</span> <span class="token symbol">:name</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token comment"># => [{:name=>"Bill", :age=>13}, {:name=>"Jane", :age=>12}, {:name=>"John", :age=>10}]</span> names <span class="token punctuation">.</span> sort_by <span class="token punctuation">{</span> <span class="token operator">|</span> h <span class="token operator">|</span> h <span class="token punctuation">[</span> <span class="token symbol">:age</span> <span class="token punctuation">]</span> <span class="token punctuation">}</span> <span class="token comment"># => [{:name=>"John", :age=>10}, {:name=>"Jane", :age=>12}, {:name=>"Bill", :age=>13}] </span> |
Delete empty element in array
Assuming you are trying to retrieve a child array from an initial array after you have removed the empty element, you can pass a block to the inject
method as follows:
1 2 | <span class="token punctuation">[</span> <span class="token string">"a"</span> <span class="token punctuation">,</span> <span class="token string">""</span> <span class="token punctuation">,</span> <span class="token string">"b"</span> <span class="token punctuation">,</span> <span class="token string">" "</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">reject</span> <span class="token punctuation">(</span> <span class="token operator">&</span> <span class="token symbol">:empty?</span> <span class="token punctuation">)</span> <span class="token comment"># => ["a", "b", " "]</span> |
And can be combined with strip
for better results:
1 2 | <span class="token punctuation">[</span> <span class="token string">"a"</span> <span class="token punctuation">,</span> <span class="token string">""</span> <span class="token punctuation">,</span> <span class="token string">"b"</span> <span class="token punctuation">,</span> <span class="token string">" "</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> reject <span class="token punctuation">{</span> <span class="token operator">|</span> e <span class="token operator">|</span> e <span class="token punctuation">.</span> strip <span class="token punctuation">.</span> empty <span class="token operator">?</span> <span class="token punctuation">}</span> <span class="token comment"># => ["a", "b"]</span> |
Bonus for the compact
method – remove all nil
elements in the array.
1 2 3 4 5 6 | <span class="token punctuation">[</span> <span class="token string">"a"</span> <span class="token punctuation">,</span> <span class="token string">""</span> <span class="token punctuation">,</span> <span class="token string">"b"</span> <span class="token punctuation">,</span> <span class="token string">" "</span> <span class="token punctuation">,</span> <span class="token keyword">nil</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> reject <span class="token punctuation">{</span> <span class="token operator">|</span> e <span class="token operator">|</span> e <span class="token punctuation">.</span> strip <span class="token punctuation">.</span> empty <span class="token operator">?</span> <span class="token punctuation">}</span> <span class="token comment"># => ["a", "b"]</span> <span class="token comment"># => NoMethodError (undefined method `strip' for nil:NilClass)</span> <span class="token punctuation">[</span> <span class="token string">"a"</span> <span class="token punctuation">,</span> <span class="token string">""</span> <span class="token punctuation">,</span> <span class="token string">"b"</span> <span class="token punctuation">,</span> <span class="token string">" "</span> <span class="token punctuation">,</span> <span class="token keyword">nil</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> compact <span class="token comment"># => ["a", "", "b", " "] </span> <span class="token punctuation">[</span> <span class="token string">"a"</span> <span class="token punctuation">,</span> <span class="token string">""</span> <span class="token punctuation">,</span> <span class="token string">"b"</span> <span class="token punctuation">,</span> <span class="token string">" "</span> <span class="token punctuation">,</span> <span class="token keyword">nil</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> compact <span class="token punctuation">.</span> reject <span class="token punctuation">{</span> <span class="token operator">|</span> e <span class="token operator">|</span> e <span class="token punctuation">.</span> strip <span class="token punctuation">.</span> empty <span class="token operator">?</span> <span class="token punctuation">}</span> <span class="token comment"># => ["a", "b"]</span> |
Putting the pieces together
The first way is simply to use the +
operator
1 2 | <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token operator">+</span> <span class="token punctuation">[</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token comment"># => [1, 2, 2, 3, 4]</span> |
It can be seen that element 2
is repeated, and if this is not desirable then we can switch to using |
.
1 2 | <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">]</span> <span class="token operator">|</span> <span class="token punctuation">[</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token comment"># => [1, 2, 3, 4]</span> |
In both ways above, we will create a new array, if you want to change immediately on the existing array, you can do the following:
1 2 3 | my_array <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token number">1</span> <span class="token punctuation">,</span> <span class="token number">2</span> <span class="token punctuation">]</span> my_array <span class="token operator">+</span> <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token number">2</span> <span class="token punctuation">,</span> <span class="token number">3</span> <span class="token punctuation">,</span> <span class="token number">4</span> <span class="token punctuation">]</span> <span class="token comment"># => [1, 2, 2, 3, 4]</span> |
Combine array into string
You can use join
(with arguments if needed) to join the elements in the array into a string.
1 2 3 | <span class="token punctuation">[</span> <span class="token string">"a"</span> <span class="token punctuation">,</span> <span class="token string">"b"</span> <span class="token punctuation">,</span> <span class="token string">"c"</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> join <span class="token comment"># => "abc"</span> <span class="token punctuation">[</span> <span class="token string">"a"</span> <span class="token punctuation">,</span> <span class="token string">"b"</span> <span class="token punctuation">,</span> <span class="token string">"c"</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">join</span> <span class="token punctuation">(</span> <span class="token string">" "</span> <span class="token punctuation">)</span> <span class="token comment"># => "a b c"</span> |
If you want to go back from string to array, you can use chars
or split
.
1 2 3 | <span class="token string">"abc"</span> <span class="token punctuation">.</span> chars <span class="token comment"># => ["a", "b", "c"]</span> <span class="token string">"abc"</span> <span class="token punctuation">.</span> <span class="token function">split</span> <span class="token punctuation">(</span> <span class="token string">""</span> <span class="token punctuation">)</span> <span class="token comment"># => ["a", "b", "c"]</span> |
Loop through array
There are many methods that support you to loop through the elements in the array.
each
: used when you are not interested in the indexeach_with_index
: used to retrieve the value – index paireach_index
: only get indexmap
: when you want to create a new array from an initial arrayselect
: when you want to retrieve a conditional sub arrayinject
: is used to render a single result from array elements
Conclusion
Hope the article will be useful to you.