Bu yazıda, liquid syntax’ı ile diziler üzerinde yapılabilecek bazı işlemler üzerinde duracağım. Etiketlere Göre İlgili Yazılar Devam konusundaki inadım üzerine liquid’in array yapısı ile epey içli dışlı oldum. Öğrendiklerimi burada not alacağım.
Boş Dizi Nasıl Tanımlanır ?
Doğru cevap: “Tanımlanamaz!” Öyle bir yol yok. Mesela, C#‘da List<int> mylist = new List<int>();
. Boş bir liste oluşturduk az önce. Liquid syntax’ında hilelere başvurmak zorundasınız.
{% assign list = '' | split: '' %}
Belli Bir Indexe Yeni Değer Nasıl Atanır ?
{% assign list[index] = value %}
index
yerine değeri eklemek istediğiniz index, value
yerine de değeri yazın.
Keşke! Ne yazık ki böyle bir yol yok. Bir dizinin belli bir indexine yeni bir değer atayamazsınız. Diziyi tamamen yeniden oluşturmalısınız.
Diziye Yeni Değer Nasıl Eklenir ?
Ekleyemezsiniz. Tek çareniz concat
fonksiyonu ki o da yalnızca array ile arrayi birleştirir. Yani yine bir hileye başvurmalıyız.
Önce, atayacağımız değeri tek elemanlı bir arraye çeviririz. Tıpkı başta boş dizi tanımladığımız gibi.
{% assign value = "my_very_special_value" | split: 'ğçş' %}
{% assign list = list | concat: value %}
Neden sadece split: ''
değil de split: 'ğçş'
. Çünkü ilk yöntem değeri karakter bazında böler. Mesela Mert |split: ''
, ['M', 'e', 'r', 't']
şeklinde 4 elemanlı dizi oluşturur. split: ','
Virgüllere göre böler. ‘ğçş’ art arda gelme ihtimali olmadığı için, bir elemanlı dizi, yani tekrar aynı değeri elde edeceğiz.
Eğer bu şekilde kukla split kullanmazsak, concat fonksiyonu yalnızca arrayler için geçerli olduğunu söyleyen bir hata verecektir.
Bir Diziyi Başka Bir Diziye Göre Sıralamak
Teknik anlamda kolay olması gereken bu olay, burada imkansıza yakındır. Aklıma ilk gelen yapı, dictionary
olmuştu. Tabii ki aradığımı bulamadım. Daha sonra kendi 2 boyutlu arrayimi oluşturayım dedim. Yine mümkün olmadığını gördüm. İki ayrı array’i aynı döngü içinde döndürmekten başka çare ne yazık ki bulamadım.
2 Boyutlu Diziler
Her ne kadar direkt iki boyutlu dizi tanımlayamasak da mevcut bir yapıya aşağıdaki gibi ulaşabiliriz.
{% assign x = site['collection_name'][0].title %}
'collection_name'
adındaki koleksiyonun 0. elamanının title
değeri x
değişkenine atanmıştır. Benzer şekilde, kendi .yaml
dosyamızı oluşturup orada multi-dimensional yapılar tanımlayıp çağırabiliriz.
En Küçük Değeri Elde Etmek
{% assign my_array = "1,2,3,4,0,1,-5,8" | split: "," %}
{% assign min_val = my_array | sort | first %}
min_val = -5
olacak şekilde atanmıştır.
Dizi[i]‘yi myVal ile Kıyaslamak
{% assign myVal = 10 %}
{% assign my_array = "1,2,3,4,0,1,-5,8" | split: "," %}
{% for arrayVal in my_array %}
{% if arrayVal > myVal %}
// Do something here...
{% endif %}
{% endfor %}
Kod sadece bir örnek, eğer array’deki değer daha büyükse if içinde bir şeyler yapacağız. Burada dikkat edilmesi gereken arrayVal’ın integer olmamasıdır. string ile integerı kıyaslayamayacağımıza dair bir hata alırız. Çözümü kolay. If statementtan hemen önce arrayVal’ı integer’a çevirmeliyiz.
{% assign arrayVal = arrayVal | times: 1 %}
Eğer float’a çevirmek istiyorsak 1.0
ile çarpmalıyız. Float’a ya da integer’a çevirmemiz bölme işleminde fark yaratacaktır. Eğer float’a çevirirsek float bölüm 1.0/4 = 0.25
, integer’a çevirirsek integer bölüm 1/4 = 0
elde ederiz.