javascript - TS 2 dizi, eğer birinci diziden bir öğe ikinci dizide varsa, onu ikinci dizinin başına ekle
İki listem var.
Biri 'tüm' nesnelerin listesi, diğeri 'özel' nesnelerin listesi.
İlk liste, özel nesneler de dahil olmak üzere tüm nesneleri içerir.
Tüm nesnelerimin listesini nasıl sıralarım, nesneleri şu şekilde sıralamak için: Önce 'özel' nesneler ve sonra geri kalan tüm nesneler?
Her nesnenin bir kimliği vardır.
Örneğin,
Liste 1:
[
{Id: 1, Name: "a", Surname: "a"},
{Id: 2, Name:"b", Surname:"b"},
{Id: 3, Name: "c", Surname: "c"}
]
Liste 2:
[
{Id: 2, Name:"b", Surname:"b"}
]
Bunu nasıl sipariş ederim, böylece son liste:
[
{Id: 2, Name:"b", Surname:"b"},
{Id: 1, Name: "a", Surname: "a"},
{Id: 3, Name: "c", Surname: "c"}
]
Cevap #1
find fonksiyonunu, karşılaştırılan iki öğeden birinin özel olup olmadığını kontrol etmek ve buna göre özel bir sort fonksiyonunda sonucu döndürmek için kullanabilirsiniz:
let all = [{Id: 1, Name: "a", Surname: "a"}, {Id: 2, Name:"b", Surname:"b"}, {Id: 3, Name: "c", Surname: "c"}];
let special = [{Id: 2, Name:"b", Surname:"b"}];
function sortFunc(a, b) {
var s1 = special.find(s=>s.Id==a.Id);
var s2 = special.find(s=>s.Id==b.Id);
if(s1 && s2) return 0;
else if(s1) return -1;
else if(s2) return 1;
return 0;
}
let sorted = all.slice().sort(sortFunc);
console.log(sorted);Cevap #2
Eğer lodash eklemeyi kabul ediyorsanız, sonucu bununla alabilirsiniz
const List1 = [
{Id: 1, Name: "a", Surname: "a"},
{Id: 2, Name:"b", Surname:"b"},
{Id: 3, Name: "c", Surname: "c"}
]
const List2 = [
{Id: 2, Name:"b", Surname:"b"}
]
const SpecialIds = _.map(List2, (v) => { return v.Id })
const List3 = _.sortBy(_.map(List1, (v) => {
return _.merge({}, v, {
...v,
Type: _.indexOf(SpecialIds, v.Id) === -1 ? '1_Normal' : '0_Special'
})
}), ['Type', 'Id'])
console.log(List3)<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>