- Konu sahibi
- #1
İlk değerlerin sırasını koruyarak dizideki tekrarları kaldırmanın en kısa yolu
Aşağıdaki örnekte
Bu yöntem dizideki ilk görülme sırasını korur. Örneğin
Nesneler için
Burada iki nesne ayrı ayrı oluşturulduğu için
Bu örnekte
Örneğin basit değerlerde alternatif olarak şu kod kullanılabilir:
Set kullanmaktır. Diziyi new Set() ile benzersiz değerlere dönüştürüp yeniden dizi elde etmek için [...new Set(dizi)] yazabilirsiniz. Örneğin [1, 2, 2, 3, 1] girdisi [1, 2, 3] sonucunu verir.Set ile tekrar eden değerleri kaldırma
Aşağıdaki örnekte
sayilar dizisindeki her değer yalnızca bir kez bırakılır:
JavaScript:
const sayilar = [1, 2, 2, 3, 1, 4, 3];
const benzersizSayilar = [...new Set(sayilar)];
console.log(benzersizSayilar);
// [1, 2, 3, 4]
Set, aynı değeri birden fazla kez saklamaz. Yayma operatörü (...) ise bu Set nesnesindeki değerleri yeniden normal bir diziye aktarır. Böylece benzersizSayilar değişkeninin sonucu bir Set değil, normal bir JavaScript dizisi olur.Bu yöntem dizideki ilk görülme sırasını korur. Örneğin
[3, 1, 3, 2, 1] dizisi [3, 1, 2] biçimine dönüşür. Ancak bu işlem yalnızca aynı kabul edilen değerleri ayıklar; nesnelerin içeriklerinin aynı olup olmadığını otomatik olarak karşılaştırmaz.Dizideki nesnelerde dikkat edilmesi gereken nokta
Nesneler için
Set referans karşılaştırması yapar. Bu nedenle aşağıdaki iki nesne görsel olarak aynı özelliklere sahip olsa da farklı nesnelerdir:
JavaScript:
const kullanicilar = [
{ id: 1, ad: 'Ayşe' },
{ id: 1, ad: 'Ayşe' }
];
const sonuc = [...new Set(kullanicilar)];
console.log(sonuc.length);
// 2
Burada iki nesne ayrı ayrı oluşturulduğu için
Set onları aynı değer olarak görmez. Nesneleri belirli bir alana, örneğin id değerine göre tekilleştirmek istiyorsanız Map kullanabilirsiniz:
JavaScript:
const kullanicilar = [
{ id: 1, ad: 'Ayşe' },
{ id: 2, ad: 'Mehmet' },
{ id: 1, ad: 'Ayşe' }
];
const benzersizKullanicilar = [
...new Map(kullanicilar.map(kullanici => [kullanici.id, kullanici])).values()
];
console.log(benzersizKullanicilar);
// [{ id: 1, ad: 'Ayşe' }, { id: 2, ad: 'Mehmet' }]
Bu örnekte
id anahtar olarak kullanılır. Aynı id tekrar gelirse sonraki nesne öncekinin yerini alır. İlk nesnenin korunmasını istiyorsanız bunu ayrıca belirtmeniz gerekir; örneğin önce görülen id değerlerini kontrol eden bir filter() çözümü kullanılabilir.Alternatif yöntemler ve seçim ölçütü
Set çoğu durumda en kısa ve okunabilir çözümdür. Daha eski çalışma ortamlarında veya karşılaştırma kuralını kendiniz tanımlamanız gereken durumlarda filter() kullanılabilir.| Yöntem | Uygun olduğu durum | Önemli sınır |
|---|---|---|
[...new Set(dizi)] | String, sayı, boolean ve benzeri basit değerleri tekilleştirmek | Nesneleri içeriklerine göre karşılaştırmaz |
filter() ve indexOf() | Karşılaştırma davranışını açıkça kontrol etmek | Kod daha uzun olur |
Map | Nesneleri belirli bir özellik, örneğin id, üzerinden tekilleştirmek | Hangi özelliğin anahtar olacağına karar vermek gerekir |
JavaScript:
const etiketler = ['js', 'css', 'js', 'html', 'css'];
const benzersizEtiketler = etiketler.filter(
(etiket, sira) => etiketler.indexOf(etiket) === sira
);
console.log(benzersizEtiketler);
// ['js', 'css', 'html']
filter() her elemanın dizide ilk kez göründüğü konumda kalmasını sağlar. Bir değer daha önce görülmüşse indexOf() o değerin ilk konumunu döndürür ve koşul başarısız olur. Sonuç beklenenden farklıysa önce dizinin gerçekten basit değerlerden mi yoksa nesnelerden mi oluştuğunu kontrol edin; nesnelerde tekilleştirme anahtarını, örneğin id alanını, açıkça belirlemeniz gerekir.