javascript - Alt özellikleri karşılaştırarak diziden 'çoğaltılmış' nesneleri kaldırma (typescript)


Sunucudan karmaşık nesnelerden oluşan bir dizi alıyorum. Her nesnenin bir alt özelliğine göre benzersiz nesnelerden oluşan yeni bir dizi elde etmek için orijinal diziyi filtrelemek istiyorum, yani:

let arr1 = originalArray;
let arr2 = originalArray.filter((ele, idx, arr) => ....

Şimdi örneğin, arr1 3 nesneden oluşuyor:

firstObj = {
    id: 0,
    Details:
        {
            License: 123456
        },
    name: 'abc'
};
secondObj = {
    id: 1,
    Details:
        {
            License: 131313
        },
    name: 'xcd'
};
thirdObj = {
    id: 2,
    Details:
        {
            License: 123456
        },
    name: 'bcd'
};

Yani, diziyi filtrelemek istiyorum, böylece yeni döndürülen dizi yalnızca iki nesneden oluşacak ve 'License' özelliği benzersiz olacak, yani aynı 'License' değerine sahip nesnelerden biri kaldırılacak. Teşekkürler.

Cevap #1

array.reduce'i kullanarak kaynak dizide döngü oluşturabilir ve sonuç dizide aynı Details.License yoksa öğeleri ekleyebilirsiniz

let result = [firstObj, secondObj, thirdObj].reduce((arr, item) => {
    let exists = !!arr.find(x => x.Details.License === item.Details.License);
    if(!exists){
        arr.push(item);
    }
    return arr;
}, []);

Cevap #2

Sıralarının önemli olmadığı durumlarda, bunları anahtar olarak Licence değerlerini kullanarak bir Map'e geçirebilirsiniz.

Harita anahtarları benzersiz olmalıdır, bu nedenle Map oluşturulurken tekrarlananlar oluştuğunda üzerine yazılacak ve her tekrarlı öğenin son örneği döndürülecektir

let uniques = [...new Map(data.map(o=>[o.Details.License,o])).values()];


console.log(uniques)
<script>
let data = [{
  id: 0,
  Details: {
    License: 123456
  },
  name: 'abc'
}, {
  id: 1,
  Details: {
    License: 131313
  },
  name: 'xcd'
}, {
  id: 2,
  Details: {
    License: 123456
  },
  name: 'bcd'
}]
</script>

Benzersiz değerleri takip etmek için Array#filter ve bir Set kullanan alternatif yaklaşım

let licSet = new Set();
let uniques = data.filter(({Details: o}) => !licSet.has(o.License) && licSet.add(o.License));


console.log(uniques)
<script>
  let data = [{
    id: 0,
    Details: {
      License: 123456
    },
    name: 'abc'
  }, {
    id: 1,
    Details: {
      License: 131313
    },
    name: 'xcd'
  }, {
    id: 2,
    Details: {
      License: 123456
    },
    name: 'bcd'
  }]
</script>

İlgili makaleler