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.
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"
Negatif indeksler de kullanılabilir
Bu ve diğer metodlarda negatif indeksler kullanılabilir. Negatif indeksler dizinin sonundan başına doğrudur. Örneğin:
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
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.
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)baslangic indeksinden itibaren eleman’ı arar ve bulursa bunun indeksini döner, bulamazsa -1 dö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. Bulursa true döner.
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.
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.
elaman eleman’ı tanımlar.
index indeks’i tanımlar.
array dizinin 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.
let arr = [ 1, 2, 15 ];
// metod dizinin içeriğini sıralar ve döndürür.
arr.sort();
alert( arr ); // 1, 15, 2
Çıktısında bir şey fark ettiniz mi?
Sıralama 1, 15, 2 oldu. Yanlış. Neden peki?
Diziler varsayılan olarak karakter sıralamasına göre sıralanırlar.
Tüm elemanlar karakter dizisine çevrilir ve karşılaştırılır. Bundan dolayı karakter sırasına göre "2" > "15" karşılaştırılır.
Kendi sıralamanızı yapmak için, iki argümanlı bir fonksiyonu arr.sort()'ın argüman olarak alması gerekmektedir.
Fonksiyon aşağıdaki şekilde çalışmalıdır:
function compare(a, b) {
if (a > b) return 1;
if (a == b) return 0;
if (a < b) return -1;
}
Örneğin:
function compareNumeric(a, b) {
if (a > b) return 1;
if (a == b) return 0;
if (a < b) return -1;
}
let arr = [ 1, 2, 15 ];
arr.sort(compareNumeric);
alert(arr); // 1, 2, 15
Şimdi beklendiği gibi çalışmakta.
Ne olduğunu düşünürsek. arr her şeyi tutabilir, değil mi? Sayı, karakter veya html elementi vs. tutabilir. İçinde bulunanları sıralamak için karşılaştırmayı yapan sıralama fonksiyonuna ihtiyaç vardır. Bunun da varsayılanı karakter sıralamadır.
arr.sort(fn) metodu içinde sıralama algoritmasına sahiptir. Bu sıralamanın nasıl çalıştığına dair bir bilgimiz olmasına gerek yok (Çoğu zaman quicksort kullanılır). Diziyi dolanır ve elemanları verilen algoritmaya göre karşılaştırır ve sıralar. Tek bilmeniz gereken fn fonksiyonunun karşılaştırmayı yaptığıdır.
Eğer hangi elemanın karşılaştırıldığını öğrenmek istiyorsanız elbette bunu görebilirsiniz.
[1, -2, 15, 2, 0, 8].sort(function(a, b) {
alert( a + " <> " + b );
});
Algoritma aynı elemanı bir kaç defa çalıştırma ihtiyacı duyabilir, fakat yine de olduğunca az karşılaştırmaya çalışır.
Karşılaştırma fonksiyonu herhangi bir sayıyı döndürebilir.
Aslında, karşılaştırma fonksiyonu “büyük” olduğunu belirtmek için pozisitif sayı, “az” olduğunu belirtmek için negatif sayı döndürmelidir.
Bu daha kısa fonksiyon yazılmasına olanak sağlar:
let arr = [ 1, 2, 15 ];
arr.sort(function(a, b) { return a - b; });
alert(arr); // 1, 2, 15
Daha zarif bir fonksiyon için ok kullanmak.
Ok fonksiyonlarını hatırlarsanız burada daha zarif bir biçimde sıralama yapılabilir:
Bunun uygulamasını gerçek hayatta şu şekilde görmek mümkndür. Bir mesajlaşma uygulaması yazıdğınızı düşünün. Gönderen kişi alıcıları virgülle ayırarak yazsın. Örneğin Ahmet, Mehmet, Muzaffer gibi. Fakat bizim için bunun bir dizi olması karakter dizisi olmasından daha kullanışlıdır. Peki bu nasıl yapılmalı?
str.split(delim) tam olarak bunu yapmaktadır. Karakterleri verilen delim e göre ayırır ve sonrasında bunları dizi olarak döner.
Aşağıdaki örnekte isimler virgül ve ardından boşluk yazarak ayrılmıştır.
let isimler = 'Bilbo, Gandalf, Nazgul';
let arr = isimler.split(', ');
for (let isim of arr) {
alert( ` ${name}'e mesaj.` ); // Bilbo'e mesaj ve diğerleri.
}
split metodu isteğe bağlı ikincil bir sayısal argüman alabilir – dizinin boyutu. Eğer bu verilirse, dizi bu verilen uzunluk kadar dolduktan sonra geri kalanlar görmezden gelinir. Pratikte çok nadir kullanılır.
let dizi = 'Bilbo, Gandalf, Nazgul, Saruman'.split(', ', 2);
alert(arr); // Bilbo, Gandalf
Harflere Çevirme
split(s)i boş s ile çağırırsanız harflerin dizisi haline getirirsiniz.
let str = "test";
alert( str.split('') ); // t,e,s,t
arr.join(str)split in tam tersini yapar. arr’den karakter dizileri yaratır.
Örnek:
let dizi = ['Bilbo', 'Gandalf', 'Nazgul'];
let str = dizi.join(';');
alert( str ); // Bilbo;Gandalf;Nazgul
Dizi elemanlarının üzerinden geçilmek istendiğinde forEach kullanmak mümkündür.
arr.reduce ve arr.reduceRight metodları da bu işe yarar fakat daha dallı budaklıdır. Genelde dizilere göre tek bir karakter dizisini hesaplamaya yarar.
Yazımı:
let value = arr.reduce(function(previousValue, item, index, arr) {
// ...
}, initial);
Fonksiyon elemanlara uygulanır. İkinciden itibaren benzer bir yazıma rastlayabilirsiniz.
item – dizinin o anki elemanı.
index – elemanın pozisyonu.
arr – dizi.
Şimdiye kadar forEach/map gibi. Fakat bir argüman daha var:
previousValue bir önceki fonksiyonun sonucudur initial ilk çağrının sonucudur.
Örnekle anlatmak gerekirse:
Aşağıda dizinin toplamı bir satırda alınmaktadır:
let arr = [1, 2, 3, 4, 5]
let result = arr.reduce((sum, current) => sum + current, 0);
alert(result); // 15
Burada reduce fonksiyonunun en çok kullanılan 2 argümanlı şekli kullanıldı.
Detaylarına bakılacak olursa:
İlk çalıştırıldığında sum başlangıç değerini alır ( reduce’un son argümanı ) 0, ve current dizinin ilk elemanıdır 1. Bundan dolayı sonuç 1 olur.
İkinci döngüde sum = 1, buna ikinci dizi elemanı olan 2 eklenir ve döndürülür.
Üçüncü döngüde ise sum = 3 ve buna bir sonraki dizi elemanı eklenir ve böyle devam eder.
Hesaplama akışı:
Form tablosunda bunu daha açık bir şekilde görebilirsiniz. Satırlar fonksiyon çağrılarını göstermektedir.
toplam
şimdiki
sonuç
birinci çağrı
0
1
1
ikinci çağrı
1
2
3
üçüncü çağrı
3
3
6
dördüncü çağrı
6
4
10
beşinci çağrı
10
5
15
Gördüğünüz gibi bir önceki fonksiyonun sonucu sonraki fonksiyonun argümanı olmakta.
Bunun ile birlikte başlangıç değerini pas geçmekte mümkün:
let arr = [1, 2, 3, 4, 5];
// başlangıç değeri silindi, 0 değil.
let result = arr.reduce((sum, current) => sum + current);
alert( result ); // 15
Sonuç aynı. Başlangıç değeri olmadığından dolayı, reduce fonksiyonu diznin ilk elemanını başlangıç değeri olarak almakta ve ikinciden itibaren döngüye başlamaktadır.
Hesaplama tablosu yukarıdaki ile aynı olmaktadır, sadece birinci satır silinir.
Fakat böyle kullanımda çok dikkatli olunmalıdır. Eğer dizi boş ise, recude çağrısı başlangıç değeri olmadığında hata verir.
Örneğin:
let arr = [];
// Hata: Başlangıç değeri olmayan boş dizi ile `reduce` fonksiyonu kullanıldı.
// Eğer başlangıç değeri olsaydı, `reduce` boş diziyi döndürebilirdi.
arr.reduce((sum, current) => sum + current);
Bundan dolayı her zaman başlangıç değeri kullanılması önerilir.
arr.reduceRight metodu da reduce metodu ile aynı işi yapar fakat diziyi sağdan sola doğru okur.
… Fakat diziler çok kullanıldığından dolayı buna has metod bulunmaktadır: Array.isArray(value) . Eğer değer dizi ise true döndürür. Diğer türlü false döndürür.
Fonksiyonları çağıran neredeyse tüm dizi metodları – find, filter, map gibi sort hariç, ayrıca opsiyonel thisArg parametresini kabul eder.
Yukarıdaki bölümde bu parametreden bahsedilmedi, bunun sebebi çok nadir olarak kullanılmasından dolayıdır. Fakat bütünlüğün sağlanmasından dolayı üstünden geçmekte fayda var.
Bu metodlarla “thisArg”'ın yazımı aşağıdaki gibidir:
arr.find(func, thisArg);
arr.filter(func, thisArg);
arr.map(func, thisArg);
// ...
// thisArg isteğe bağlı olarak kullanılan bir argümandır.
thisArg değeri func için this olmaktadır.
Örneğin, aşağıda objenin metodu filtre olarak kullanılmaktadır ve thisArg bu durumda oldukça kullanışlıdır:
let kullanici = {
yas: 18,
dahaGenc(digerKullanici) {
return digerKullanici.yas < this.yas;
}
};
let kullanicilar = [
{yas: 12},
{yas: 16},
{yas: 32}
];
// kullanıcıdan daha genç kullanıcıları bulunuz
let dahaGencKullanicilar = kullanicilar.filter(kullanici.dahaGenc, kullanici);
alert(dahaGencKullanicilar.length); // 2
Yukarıdaki çağrıda kullanici.dahaGenc filtre olarak kullanılmaktadır. Ayrıca kullanici bu fonksiyona gönderilmektedir. Eğer kullanici.filter(kullanici.dahaGenc)'i vermezseniz, kullanici.dahaGencthis=undefined olarak çağrılır. Bu da anında hata verir.
Görünürde çok fazla metod varmış gibi ve ezberlemesi zormuş gibi görünse de aslında göründüğünden çok daha kolaydır.
Sadece tanımların bulunduğu sayfaya bakmanız yeterlid. Ardından bu bölümdeki örnekleri çözerek pratik yaparsanız metodlar ile ilgili yeteri kadar bilgi sahibi olmuş olursunuz.
Daha sonrasında metodlar ile ilgili bir şey yapmak istediğinizde, nasıl yapıldığını bilmiyorsanız, buraya tekrar gelip doğru metodu bulabilirsiniz.
Buradaki örnekler doğru bir şekilde yazmanıza yardımcı olacaktır. Sonrasında metodları hiçbir özel çaba harcamadan hatırlayacak duruma gelebilirsiniz.
function camelize(str) {
return str
.split('-') // splits 'my-long-word' into array ['my', 'long', 'word']
.map(
// capitalizes first letters of all array items except the first one
// converts ['my', 'long', 'word'] into ['my', 'Long', 'Word']
(word, index) => index == 0 ? word : word[0].toUpperCase() + word.slice(1)
)
.join(''); // joins ['my', 'Long', 'Word'] into 'myLongWord'
}
function filterRangeInPlace(arr, a, b) {
for (let i = 0; i < arr.length; i++) {
let val = arr[i];
// remove if outside of the interval
if (val < a || val > b) {
arr.splice(i, 1);
i--;
}
}
}
let arr = [5, 3, 8, 1];
filterRangeInPlace(arr, 1, 4); // removed the numbers except from 1 to 4
alert( arr ); // [3, 1]
Create a constructor function Calculator that creates “extendable” calculator objects.
The task consists of two parts.
First, implement the method calculate(str) that takes a string like "1 + 2" in the format “NUMBER operator NUMBER” (space-delimited) and returns the result. Should understand plus + and minus -.
Usage example:
let calc = new Calculator;
alert( calc.calculate("3 + 7") ); // 10
Then add the method addMethod(name, func) that teaches the calculator a new operation. It takes the operator name and the two-argument function func(a,b) that implements it.
For instance, let’s add the multiplication *, division / and power **:
let powerCalc = new Calculator;
powerCalc.addMethod("*", (a, b) => a * b);
powerCalc.addMethod("/", (a, b) => a / b);
powerCalc.addMethod("**", (a, b) => a ** b);
let result = powerCalc.calculate("2 ** 3");
alert( result ); // 8
No brackets or complex expressions in this task.
The numbers and the operator are delimited with exactly one space.
There may be error handling if you’d like to add it.
kullanici dizindeki elemanlar adi, soyadi ve id özelliklerine sahiptirler.
Bunlardan özellikleri id, adi_soyadi şeklinde adi ve soyadi özelliklerinden türeyen adi_soyadi özelliğine sahip objelerden sahip yeni bir dizi oluşturunuz.
Örneğin:
let ahmet = { adi: "Ahmet", soyadi: "Doğtaş", id: 1 };
let mehmet = { adi: "Mehmet", soyadi: "İstikbal", id: 2 };
let muzaffer = { adi: "Muzaffer", soyadi: "Bellona", id: 3 };
let kullanicilar = [ ahmet, mehmet, muzaffer ];
let kullaniciMapped = /* ... Sizin kodunuz ... */
/*
kullaniciMapped = [
{ adi_soyadi: "Ahmet Doğtaş", id: 1 },
{ adi_soyadi: "Mehmet İstikbal", id: 2 },
{ adi_soyadi: "Muzaffer Bellona", id: 3 }
]
*/
alert( kullaniciMapped[0].id ) // 1
alert( kullaniciMapped[0].adi_soyadi ) // Ahmet Doğtaş
Burada yapmanız gereken aslında bir dizideki objeleri diğerine eşlemek(map etmek). => kullanabilirsiniz.
Hatırlayacağınız üzere iki türlü ok fonksiyonu bulunmaktadır: Gövdesi olmadan deger => ifade veya gövdeli deger => {...}
Bizim kullandığımız şekliyle JavaScript {'i fonksiyon başlangıcı olarak kabul etmektedir. Objenin başlangıcı değil. Halbuki biz obje olmasını istiyoruz. Bu durumda bunları “normal” parantez içine almamız gerekmekte.
Her eleman aynı olasılıkla sıralanmalıdır. Örneğin [1,2,3][1,2,3] veya [1,3,2] veya [3,1,2] vs. şeklinde sıralanabilir olmalıdır.
En basit çözümü aşağıdaki gibi olabilir.
function karistir(dizi) {
dizi.sort(() => Math.random() - 0.5);
}
let dizi = [1, 2, 3];
karistir(dizi);
alert(dizi);
Yukarıdaki çalışıyor denebilir çünkü Math.random()-0.5 rasgele bir sayıdır ve pozitif veya negatif olabilir. Böylece sıralama fonksiyonu rasgele elemanları dizer.
Fakat sıralama fonksiyonu bu amaçla kullanılamaz. Tüm permütasyon aynı olasılıkta değildirler.
Aşağıdaki koda bakılacak olursa karistir 1000000 defa çalıştırılacak olursa bile olası sonuçlar şu şekildedir:
function shuffle(array) {
array.sort(() => Math.random() - 0.5);
}
// mümkün olan tüm permütasyonların görünme sayısı.
let count = {
'123': 0,
'132': 0,
'213': 0,
'231': 0,
'321': 0,
'312': 0
};
for(let i = 0; i < 1000000; i++) {
let array = [1, 2, 3];
karistir(array);
count[array.join('')]++;
}
// mümkün olan tüm permütasyonların görünme sayısı.
for(let key in count) {
alert(`${key}: ${count[key]}`);
}
( Temmuz 2017 itibari ile sonuçlar aşağıdaki gibidir.)
Görüğünüz gibi 123 ve 213 ün çıkma olasılığı daha fazladır.
Sonuçlar JavaScript motoruna göre değişebilir. Fakat görüldüğü gibi bu fonksiyon çok güvenilir değildir.
Neden çalışmadı? Genel olarak konuşmak gerekirse sort kara kutudur: biz buraya bir dizi göndeririz o içinde karşılaştırma fonksiyonları vs. kullanır ve biz sıralanmış şekilde bu diziyi alırız. Bu kadar fazla rasgele karşılaştırmadan dolayı bu kara kutu deliye döndü, bu deliye dönme olayında nasıl davranacağı da JavaScript motoruna bağlıdır.
Bu problem bir kaç yöntemle çözülebilir. Fisher-Yates shuffle. Fikre göre dizi tersten başlayarak rasgele sayı ile değiştirilecek şekilde yazılmalıdır:
function karistir(array) {
for(let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i+1)); // random index 0 ile i arasında
[array[i], array[j]] = [array[j], array[i]]; // elemanların yer değiştirmesi için.
}
}
Aynı şekilde test edilirse:
function karistir(array) {
for(let i = array.length - 1; i > 0; i--) {
let j = Math.floor(Math.random() * (i+1));
[array[i], array[j]] = [array[j], array[i]];
}
}
// mümkün olan tüm permütasyonların görünme sayısı.
let count = {
'123': 0,
'132': 0,
'213': 0,
'231': 0,
'321': 0,
'312': 0
};
for(let i = 0; i < 1000000; i++) {
let array = [1, 2, 3];
karistir(array);
count[array.join('')]++;
}
// show counts of all possible permutations
for(let key in count) {
alert(`${key}: ${count[key]}`);
}
ortalamaYasAl(kullanicilar) adında bir fonksiyon alınız. Bu fonksiyon yas ozelliğine sahip objelerden oluşan bir dizi alsın ve bunların ortalamasını hesaplasın.
Ortalama formülü (yas1 + yas2 + ..... + yasN) / N
Örneğin:
let muzaffer = { adi: "Muzaffer", yas: 25 };
let mehmet = { adi: "Mehmet",yas: 30 };
let ahmet = { adi: "Ahmet", yas: 29 };
let arr = [ muzaffer , mehmet, ahmet ];
alert( ortalamaYasAl(arr) ); // (25+30+29)/3 = 28
function ortalamaYasAl(kullanicilar) {
return kullanicilar.reduce((onceki, kullanici) => onceki + kullanici.yas, 0) / kullanicilar.length;
}
let muzaffer = { adi: "Muzaffer", yas: 25 };
let mehmet = { adi: "Mehmet",yas: 30 };
let ahmet = { adi: "Ahmet", yas: 29 };
let arr = [ muzaffer , mehmet, ahmet ];
alert( ortalamaYasAl(arr) ); // 28
Her eleman için sonuç dizisinde bu elemanın olup olmadığınına bakılacak.
Eğer var ise, görmezden gelinecek, diğer türlü sonuç dizisine eklenecek.
function benzersiz(arr) {
let sonuc = [];
for (let str of arr) {
if (!sonuc.includes(str)) {
sonuc.push(str);
}
}
return sonuc;
}
let kullanicilar = ["Emine", "Muzaffer", "Fatma", "Kanako",
"Kanako", "Muzaffer", "Fatma", "Kanako", ":-O"
];
alert( benzersiz(kullanicilar) ); // Emine, Muzaffer, Fatma, Kanako, :-O
Kod çalışacaktır, fakat performans problemi yaratabilir.
sonuc.includes(str)sonuc dizisini tamamen dolanır ve str ile karşılaştırır.
Diyelimki sonuc dizisinde 100 tane eleman var ve str ile eşleşen yok. sonuc dizisi dolanılacak ve kesinlikle 100 defa karşılaştırma yapılacaktır. Eğer sonuc dizisi 10000 gibi elemana sahip ise bu karşılaştırma 10000 olacaktır.
Aslında problem bu değildir. JavaScript motoru 10000 karşılaştırmayı mikrosaniyeler içerisinde yapabilir.
Asıl sorun bu testlerin arr’in her bir elemanı için yapılmasıdır.
Yani arr.length10000 olduğundan dolayı biz 10000*10000 = 100 milyon karşılaştırma olmaktadır.
Bundan dolayı bu çözüm az elemana sahip diziler için kullanılabilir.
Eğer makalede bir yeri anlamadıysanız lütfen belirtiniz.
Koda birkaç satır eklemek için <code> kullanınız, birkaç satır eklemek için ise <pre> kullanın. Eğer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)
You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.