removeDuplicates () bir nesne dizisini alır ve yinelenen nesneler olmadan yeni bir dizi döndürür (id özelliğine dayalı olarak).
const allTests = [
{name: 'Test1', id: '1'},
{name: 'Test3', id: '3'},
{name: 'Test2', id: '2'},
{name: 'Test2', id: '2'},
{name: 'Test3', id: '3'}
];
function removeDuplicates(array) {
let uniq = {};
return array.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true))
}
removeDuplicates(allTests);
Beklenen sonuç:
[
{name: 'Test1', id: '1'},
{name: 'Test3', id: '3'},
{name: 'Test2', id: '2'}
];
İlk olarak, uniq değişkeninin değerini boş bir nesneye ayarladık.
Ardından, nesneler dizisine filtre uygularız. Filtre, sağlanan işlev tarafından uygulanan sınamayı geçen tüm öğeleri içeren yeni bir dizi oluşturur.
return array.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true));
Yukarıda, && 'nın kısa devre işlevselliğini kullanıyoruz. && öğesinin sol tarafı true olarak değerlendirilirse, && öğesinin sağındaki değeri döndürür. Sol taraf yanlışsa, && öğesinin sol tarafındaki şeyi döndürür.
Her nesne (obj) için uniq'i obj.id değeri adlı bir özellik için kontrol ederiz (Bu durumda, ilk yinelemede '1' özelliğini kontrol eder.) Döndürdüğünün tersini istiyoruz (ya doğru veya false) bu yüzden! ! uniq [obj.id] içinde. Uniq zaten id özelliğine sahipse, filtre işlevine bu objeyi eklememesini söyleyen false (!) Olarak değerlendirilen true değerini döndürür. Ancak, obj.id özelliğini bulamazsa, false değerini döndürür ve sonra true (!) Olarak değerlendirir ve her şeyi && veya (uniq [obj.id] = true) değerinin sağına döndürür. Bu, true değerini, filtre yöntemine döndürülen diziye eklemesini söyler ve ayrıca {1: true} özelliğini uniq'e ekler. Bu, aynı kimliğe sahip başka herhangi bir obj örneğinin tekrar eklenmeyeceğini garanti eder.