Emre

WFN Üye
Konular
1,662
Mesajlar
1,758
Çözüm
0
Ticaret Puanı
0
Üyelik
9 Ay 4 Gün
Konum
Samsun
Web Sitesi
Var
Alanı
WordPress Uzm.
1/1
Konu sahibi
Bir dizideki tekrar eden değerleri kaldırmanın en kısa yolu, diziyi Set nesnesine dönüştürüp yeniden diziye çevirmektir: const benzersiz = [...new Set(dizi)]; Bu yöntem aynı değerin yalnızca ilk karşılığını korur ve değerlerin dizideki ilk görülme sırasını bozmaz.

En pratik çözüm: Set kullanmak​


Set, aynı değeri birden fazla kez saklamayan bir JavaScript koleksiyonudur. Elinizdeki diziyi Set ile sarmaladığınızda tekrarlar otomatik olarak elenir; yayma operatörü (...) ise sonucu yeniden normal diziye dönüştürür.

JavaScript:
const sayilar = [1, 2, 2, 3, 4, 4, 5, 1];

const benzersizSayilar = [...new Set(sayilar)];

console.log(benzersizSayilar);
// [1, 2, 3, 4, 5]

Burada sayilar dizisi değiştirilmez. benzersizSayilar adlı yeni dizi oluşturulur ve her değerin ilk görülen karşılığı korunur. Örneğin 2 ikinci kez geldiğinde Set bunu tekrar olarak kabul eder ve sonuç dizisine eklemez.

Bu çözüm yalnızca sayılar için değil, metinler, boole değerleri ve karışık temel değerler için de kullanılabilir:

JavaScript:
const etiketler = ["javascript", "react", "javascript", "node.js", "react"];
const benzersizEtiketler = [...new Set(etiketler)];

console.log(benzersizEtiketler);
// ["javascript", "react", "node.js"]

Sonucun yeni bir dizi olduğunu unutmayın. Tekrarları kaldırılmış diziyi kullanmak için sonraki işlemlerde benzersizSayilar veya benzersizEtiketler değişkenini kullanmanız gerekir. Orijinal dizinin de değişmesini istiyorsanız sonucu tekrar aynı değişkene atayabilirsiniz:

JavaScript:
let sayilar = [1, 2, 2, 3, 4, 4];
sayilar = [...new Set(sayilar)];

console.log(sayilar);
// [1, 2, 3, 4]

Hangi yöntem hangi durumda uygundur?​


Çoğu durumda Set yeterlidir. Ancak dizideki değerler nesne olduğunda veya tekrar tanımınız özel bir kurala bağlı olduğunda farklı bir yaklaşım gerekir.
DurumUygun yöntemSonuç
Sayı, metin veya boole değerleriSetAynı temel değerlerin tekrarlarını kaldırır.
Nesneler, aynı kimlik değerine göre tekrarlıMap veya filter()Belirlediğiniz özelliğe göre tek kayıt bırakır.
Özel karşılaştırma kuralıfilter()Tekrar kabul edilecek durumu sizin belirlemenizi sağlar.
Set değerleri doğrudan karşılaştırır. Nesnelerde ise içerikleri aynı görünse bile nesneler farklı referanslarsa farklı kabul edilir:

JavaScript:
const kullanicilar = [
  { id: 1, ad: "Ayşe" },
  { id: 1, ad: "Ayşe" }
];

const benzersizKullanicilar = [...new Set(kullanicilar)];

console.log(benzersizKullanicilar.length);
// 2

Sonucun iki olmasının nedeni, iki nesnenin içerikleri aynı olsa da bellekte ayrı nesneler olmasıdır. Bu nedenle nesneleri id gibi belirli bir özelliğe göre benzersizleştirmek gerekir. Map kullanımı, her kimlik için son kaydı koruyan pratik bir çözümdür:

JavaScript:
const kullanicilar = [
  { id: 1, ad: "Ayşe" },
  { id: 2, ad: "Mehmet" },
  { id: 1, ad: "Ayşe Yılmaz" }
];

const benzersizKullanicilar = [
  ...new Map(kullanicilar.map(kullanici => [kullanici.id, kullanici])).values()
];

console.log(benzersizKullanicilar);
// [
//   { id: 1, ad: "Ayşe Yılmaz" },
//   { id: 2, ad: "Mehmet" }
// ]

Bu örnekte id anahtar olarak kullanılır. Aynı id tekrar geldiğinde sonraki nesne öncekinin yerine geçer. İlk kaydı korumak isterseniz Map oluştururken diziyi sondan başa doğru işleyebilir veya filter() ile ilk karşılaşmayı bırakabilirsiniz.

Büyük-küçük harf ve boşluk farkına dikkat edin​


Set, metinleri otomatik olarak küçük harfe çevirmez ve başındaki veya sonundaki boşlukları yok saymaz. Bu nedenle "JavaScript", "javascript" ve "JavaScript " farklı değerlerdir.

Bu değerleri aynı kabul etmek istiyorsanız önce normalleştirme yapın:

JavaScript:
const kelimeler = ["JavaScript", "javascript", " JAVASCRIPT "];

const benzersizKelimeler = [
  ...new Set(kelimeler.map(kelime => kelime.trim().toLowerCase()))
];

console.log(benzersizKelimeler);
// ["javascript"]

Bu işlem özgün yazımı korumaz; sonuçta tüm metinler küçük harfe ve boşluksuz biçime dönüştürülür. Hem benzersizliği normalleştirilmiş değere göre belirleyip hem de ilk özgün metni korumak istiyorsanız nesneleri anahtar olarak kullanan bir Map yaklaşımı tercih etmelisiniz.

Sonucu nasıl kontrol etmelisiniz?​


Tekrarların kaldırılıp kaldırılmadığını kontrol etmek için sonuç dizisinin uzunluğunu ve içeriğini inceleyebilirsiniz:

JavaScript:
const dizi = ["a", "b", "a", "c", "b"];
const benzersiz = [...new Set(dizi)];

console.log(benzersiz);
console.log(benzersiz.length);
// ["a", "b", "c"]
// 3

Sonuç dizisindeki sıra korunuyor ve her temel değer bir kez görünüyorsa işlem doğru uygulanmıştır. Ancak nesnelerde yalnızca Set kullanıp beklenen sonucu alamazsanız bu bir JavaScript hatası değildir; nesnelerin içeriklerine değil referanslarına göre karşılaştırıldığını gösterir. Bu durumda tekrar ölçütünü açıkça belirleyip Map veya filter() kullanmanız gerekir.
 

Sende şimdi bize katılmak ister misin?

Kayıt ol

Bize katılım kolay ve ücretsizdir!

Foruma git ?

Bu konuyu görüntüleyen kullanıcılar

Bu konuyu şu anda görüntüleyen üye bulunmuyor.
Robotlar:
  • Anthropic