Emre

WFN Üye
Konular
1,644
Mesajlar
1,740
Çözüm
0
Ticaret Puanı
0
Üyelik
9 Ay 3 Gün
Konum
Samsun
Web Sitesi
Var
Alanı
WordPress Uzm.
1/1
Konu sahibi
İlk değerlerin sırasını koruyarak dizideki tekrarları kaldırmanın en kısa yolu 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öntemUygun olduğu durumÖnemli sınır
[...new Set(dizi)]String, sayı, boolean ve benzeri basit değerleri tekilleştirmekNesneleri içeriklerine göre karşılaştırmaz
filter() ve indexOf()Karşılaştırma davranışını açıkça kontrol etmekKod daha uzun olur
MapNesneleri belirli bir özellik, örneğin id, üzerinden tekilleştirmekHangi özelliğin anahtar olacağına karar vermek gerekir
Örneğin basit değerlerde alternatif olarak şu kod kullanılabilir:

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.

Sık sorulan sorular​

Tekrarları kaldırırken dizinin sırası korunur mu?​

Evet. Set ile oluşturulan sonuç, değerlerin dizide ilk görüldüğü sırayı korur. Bu işlem diziyi sıralamaz; yalnızca sonraki tekrarları çıkarır.

Boş dizi veya tekrar içermeyen dizi nasıl sonuçlanır?​

[...new Set([])] sonucu boş bir dizi olur. Dizide zaten tekrar yoksa değerler aynı sırayla geri döner; yeni bir dizi oluşturulduğu için özgün dizi ayrıca korunur.
 

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