Diziler birçok metod sunarlar. İşleri daha kolaylaştırmak için bu bölüm ikiye ayrılacaktır.
Elaman silme/ekleme
Eleman eklemenin ve silmenin baştan ve sondan nasıl olacağını gördünüz:
arr.push(...items)– elemanları sona ekler,arr.pop()– sondaki elemanı çıkarır.arr.shift()– başlangıçtan eleman çıkarır.arr.unshift(...items)– başlangıça eleman ekler.
Diğer birkaç metod ise aşağıdaki gibidir.
splice
Diziden eleman nasıl silinir?
Diziler de obje olduklarından dolayı, delete kullanarak silinebilir.
let arr = ["eve", "gitmek", "istiyorum"];
delete arr[1]; // "gitmek" silinecek
alert( arr[1] ); // undefined
// şimdi arr = ["eve", , "istiyorum"];
alert( arr.length ); // 3
Eleman silinmesine rağmen, dizi hala 3 elemana sahip. Bunu arr.length == 3 kontrolünü yaparak görebilirsiniz.
Olması gereken de bu, çünkü delete obj.key değeri anahtara göre siler. Sadece bu işi yapar. Bu da objeler için yeterlidir. Fakat diziler için genelde istediğimiz elamanların birbirlerinin yerleri doldurmasıdır. Bundan dolayı dizinin kısaldığını görmemiz lazım.
Bundan dolayı özel metodlar kullanılmalıdır.
arr.splice(str) metodu isviçre çakısı gibi her işe yarar. Diziye yeni bir eleman ekleyebilir ve silebilir.
Yazımı:
arr.splice(index[, deleteCount, elem1, ..., elemN])
index’ten başlar ve deleteCountkadar elemanı siler ve sonra elem1, ..., elemN şeklinde yerlerine yerleştirir. Diziden silinen elemanları dönderir.
Bu metodu örnek ile anlamak çok daha kolaydır.
Silme işlemi ile başlayalım:
let arr = ["Ben", "JavaScript", "çalışıyorum"];
arr.splice(1, 1); // index 1'den 1 elaman sil
alert( arr ); // ["Ben", "çalışıyorum"]
Kolay değil mi? 1. indeksten başlayarak 1 eleman sildi.
Bir sonraki örnekte ise 4 eleman silinecek ve yeni bir eleman bunların yerine konulacak.
let arr = ["Ben", "şu", "an", "JavaScript", "çalışıyorum"];
// İlk 4 elamanı sil ve öncesine yeni eleman ekle.
arr.splice(0, 4, "Ders")
alert( arr ) // Şimdi [Ders çalışıyorum]
Burada splice in silinen elemanları döndürdüğü görülebilir.
let arr = ["Ben", "şu", "an", "JavaScript", "çalışıyorum"];
// ilk iki elemanı sil.
let removed = arr.splice(0, 2);
alert( removed ); // "Ben", "şu" <-- silinen elemanlar
splice metodu ayrıca hiçbir şey silmeden de ekleme yapabilir. Bunun için deleteCount’u 0 yapmanız gerekmektedir:
let arr = ["Ben", "JavaScript", "çalışıyorum"];
// 1. indeksten
// 0 tane sil
// Sonrasında "karmaşık" ekle
arr.splice(1, 0, "karmaşık");
alert( arr ); // "Ben", "karmaşık", "JavaScript", "çalışıyorum"
Bu ve diğer metodlarda negatif indeksler kullanılabilir. Negatif indeksler dizinin sonundan başına doğrudur. Örneğin:
let arr = [1, 2, 5]
// indeks -1 ( sondan birinci )
// 0 eleman sil,
// 3 vs 4 ekle
arr.splice(-1, 0, 3, 4);
alert( arr ); // 1,2,3,4,5
slice
arr.slice metodu arr.splice’a göre daha basittir.
Yazımı:
arr.slice(start, end)
Yeni bir dizi döndürür. Bu dizi içerisinde "start" ile "end" arasında ( "end" dahil olmadan ) tüm elemanları kopyalar. start ve end negatif olabilir. Negatif durumlarda dizi sondan değer başlar.
str.slice gibi çalışır fakat karakter dizisi(string) yapmak yerine alt-dizi yapar.
Örneğin:
let str = "test";
let arr = ["t", "e", "s", "t"];
alert( str.slice(1, 3) ); // es
alert( arr.slice(1, 3) ); // e,s
alert( str.slice(-2) ); // st
alert( arr.slice(-2) ); // s,t
concat
arr.concat metodu dizi ile diğer dizileri veya elemanları birbirine eklemeye yarar.
Yazımı:
arr.concat(arg1, arg2...)
İstenildiği kadar argümanı kabul eder, bunlar dizi veya değer olabilir.
Sonuç arr, ardından arg1, arg2 şeklinde tüm dizileri ve değerleri içeren bir dizi olur.
Eğer bir argüman dizi ve Symbol.isConcatSpreadable özelliğine sahip ise bunun tüm alt elemanları kopyalanır. Diğer türlü argümanın sadece kendisi kopyalanır.
Örneğin:
let arr = [1, 2];
// diziyi [3,4] ile birleştir
alert( arr.concat([3, 4])); // 1,2,3,4
// diziyi [3,4] ve [5,6] ile birleştir
alert( arr.concat([3, 4], [5, 6])); // 1,2,3,4,5,6
// diziyi [3,4] ile birleştir ve ardından 5, 6 ekle
alert( arr.concat([3, 4], 5, 6)); // 1,2,3,4,5,6
Normalde, dizide bulunan elemanları kopyalar. Diğer objeler dizi olsalar bile bir bütün olarak eklenirler.
let arr = [1, 2];
let arrayLike = {
0: "something",
length: 1
};
alert( arr.concat(arrayLike) ); // 1,2,[object Object]
//[1, 2, arrayLike]
…Fakat dizi benzeri obje Symbol.isConcatSpreadable özelliğine sahipse, bunların elemanları eklenir:
let arr = [1, 2];
let arrayLike = {
0: "başka",
1: "bir şey",
[Symbol.isConcatSpreadable]: true,
length: 2
};
alert( arr.concat(arrayLike) ); // 1,2,başka,bir şey
Dizide arama
Dizi içerisinde aramak için bazı metodlar bulunmaktadır.
indexOf/lastIndexOf ve includes
arr.indexOf, arr.lastIndexOf ve arr.includes aynı yazıma sahiptirler, ve aslında hepsi aynı işi yapar. Sadece karakterler yerine elemanlar üzerinde çalışırlar.
arr.indexOf(eleman, balangic)baslangicindeksinden itibareneleman’ı arar ve bulursa bunun indeksini döner, bulamazsa-1döner.arr.lastIndexOf(eleman, baslangic)– aynı, fakat bu sağdan sola doğru bakar.arr.includes(eleman, baslangic)–elemanbaslangıc’tan başlayarak elemanları kontrol eder. Bulursatruedöner.
Örneğin:
let arr = [1, 0, false];
alert( arr.indexOf(0) ); // 1
alert( arr.indexOf(false) ); // 2
alert( arr.indexOf(null) ); // -1
alert( arr.includes(1) ); // true
Bu metodlar eşitlik kontrolü için === kullanır. Bundan dolayı false’a bakacak olursanız 0 ile eşit değildir. Sadece false ile eşittir.
Eğer sadece dizi içinde var olup olmadığını kontrol etmek istiyorsanız arr.includes tercih edilir.
find and findIndex
Objelerden oluşma bir dizinin olduğunu varsayın. Bazı şartları sağlayan objeleri nasıl bulursunuz.
Burada arr.find metodu yararlı olur.
Yazımı:
let result = arr.find(function(elaman, index, dizi) {
// eğer aranan eleman bulunursa true döndürmeli.
});
Bu fonksiyon her eleman için tekrar tekrar çağırılır.
elamaneleman’ı tanımlar.indexindeks’i tanımlar.arraydizinin kendisidir.
Eğer true döndürür ise arama durur ve eleman’ın kendisi döner. Eğer bulunamazsa undefined döndürülür.
Örneğin, kullanıcıların bulunduğu bir dizi ve her dizide id ve isim alanları bulunsun. id == 1 olan elemanı bulalım.
let kullanicilar = [
{id: 1, isim: "Ahmet"},
{id: 2, isim: "Muzaffer"},
{id: 3, isim: "Emine"}
];
let kullanici = kullanicilar.find(eleman => eleman.id == 1);
alert(kullanici.isim); // Ahmet
Objelerin dizi içerisinde yer alması çokça karşılaşılan bir olaydır, bundan dolayı find metodu çok kullanışlıdır.
Dikkat ederseniz find metodunda sadece bir tane argüman kullanılmıştır item => item.id == 1. find metodunun diğer parametreleri çok nadir olarak kullanılır.
arr.findIndex metodu da aynı find metodu gibi çalışır fakat elemanın kendi yerine index’ini döndürür.