Diyelim ki aşağıdaki gibi bir dizi nesnemiz var:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | const kitaplar = [ { isim: "Ben Kirke", yazar: "Madeline Miller" }, { isim: "Fahrenheit 451", yazar: "Ray Bradbury" }, { isim: "Ben Kirke", yazar: "Madeline Miller" } ]; |
Dizideki ilk ve son nesneler aynıdır. Öyleyse, bu gibi tekrarlanan nesneleri diziden kaldırmak istiyorsak ne olur? Şaşırtıcı bir şekilde, bu çözmek için oldukça zor bir sorundur. Nedenini anlamak için, yinelemeleri, dizeler gibi bir düz öğe dizisinden nasıl kaldırabileceğimize bakalım.
Dizi olarak yinelenen düz öğeleri kaldırma (basit yöntem)
Diyelim ki aşağıdaki gibi bir dizi dizimiz var:
1 2 3 4 5 6 7 | const kitaplar = [ "Ben Kirke", "Fahrenheit 451", "Ben Kirke" ]; |
Herhangi bir kopyayı bu diziden kaldırmak istiyorsak, verilen herhangi bir öğenin kopya olup olmadığını kontrol etmek için filter() yöntemini indexOf() yöntemiyle birlikte kullanabiliriz.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | const kitaplar = [ "Ben Kirke", "Fahrenheit 451", "Ben Kirke" ]; const filitre = kitaplar.filter((item, index) => { // Eğer mevcut öğenin indeksi aynı ise, yeni diziye dön. return kitaplar.indexOf(item) === index; }); console.log(filitre); |
kitaplar.indexOf (item), her zaman maddenin ilk oluşumunun indeksini döndüreceğinden, filtre döngüsündeki mevcut öğenin kopya olup olmadığını söyleyebiliriz. Öyleyse, onu filter() yöntemi tarafından oluşturulan yeni diziye döndürmeyiz.
Nesneler aynı şekilde çalışmıyor
Bu aynı yöntemin nesnelerle çalışmamasının nedeni, aynı özelliklere ve değerlere sahip 2 nesnenin aslında aynı sayılmamasıdır. Referans türündeki değerler her zaman bir birinden farklıdır. Bellekteki referansları hiç bir zaman aynı olmaz.
Çözüm
Bu bilgi göz önüne alındığında, iki nesnenin aynı özelliklere ve değerlere sahip olup olmadığını kontrol etmenin tek yolu, aslında her nesnenin özelliklerini ve değerlerini kontrol etmektir. Karşılaştığım çözüm, bu manuel kontrolü gerçekleştirdi, ancak performansı artırmak ve gereksiz iç içe döngüleri azaltmak için bazı geliştirmeler yaptım.
Özellikle, 3 şey yaptım –
Aynı nesneleri bir kereden fazla karşılaştırmamak için, dizideki her öğeyi yalnızca sonraki diğer öğelere karşı denetleyin
Yalnızca başka bir öğenin kopyası olduğu bulunmayan öğeleri kontrol edin
Her özelliğin değerinin aynı olup olmadığını kontrol etmeden önce, her iki nesnenin de aynı tuşlara sahip olduğunu kontrol edin.
İşte son işlev:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <script> const kitaplar = [ { isim: "Ben Kirke", yazar: "Madeline Miller" }, { isim: "Fahrenheit 451", yazar: "Ray Bradbury" }, { isim: "Ben Kirke", yazar: "Madeline Miller" } ]; function essizKayitlar(arr, comp) { const essiz = arr .map(e => e[comp]) .map((e, i, final) => final.indexOf(e) === i && i) .filter(e => arr[e]).map(e => arr[e]); return essiz; } console.log(essizKayitlar(kitaplar,'isim')) </script> |
Yukarıdaki kodda, map yönteminin çıktısının diğer map yönteminin girişi olacağı zincirleme modelini kullanıyoruz.
Yorum Yap