- Konu sahibi
- #1
Bir dizideki tekrar eden değerleri kaldırmanın en kısa yolu, diziyi
Burada
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:
Sonucun yeni bir dizi olduğunu unutmayın. Tekrarları kaldırılmış diziyi kullanmak için sonraki işlemlerde
Çoğu durumda
Sonucun iki olmasının nedeni, iki nesnenin içerikleri aynı olsa da bellekte ayrı nesneler olmasıdır. Bu nedenle nesneleri
Bu örnekte
Bu değerleri aynı kabul etmek istiyorsanız önce normalleştirme yapın:
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
Tekrarların kaldırılıp kaldırılmadığını kontrol etmek için sonuç dizisinin uzunluğunu ve içeriğini inceleyebilirsiniz:
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 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.| Durum | Uygun yöntem | Sonuç |
|---|---|---|
| Sayı, metin veya boole değerleri | Set | Aynı 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.