JavaScript Diziden Yinelenen Nesneleri Kaldırma – Tasarım Kodlama
JavaScript

JavaScript Diziden Yinelenen Nesneleri Kaldırma

Diyelim ki aşağıdaki gibi bir dizi nesnemiz var:

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:

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.

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:

Yukarıdaki kodda, map yönteminin çıktısının diğer map yönteminin girişi olacağı zincirleme modelini kullanıyoruz.

Yorum bırak