TS 2数组,若第一个数组中的项存在于第二个数组中,则追加到第二个阵列的开头



我有两个对象列表。

一个是"所有"对象列表,第二个是"特殊"对象列表。

第一个列表包含所有对象,包括特殊对象。

如何对"所有"对象列表进行排序,以便按以下方式对对象进行排序:首先是"特殊"对象,然后是所有其他对象?

每个对象都有一个id。

例如,

列表1:

[
{Id: 1, Name: "a", Surname: "a"},
{Id: 2, Name:"b", Surname:"b"},
{Id: 3, Name: "c", Surname: "c"}
]

清单2:

[
{Id: 2, Name:"b", Surname:"b"}
]

我该如何订购,所以最终列表是:

[
{Id: 2, Name:"b", Surname:"b"},
{Id: 1, Name: "a", Surname: "a"},
{Id: 3, Name: "c", Surname: "c"}
]

您可以使用find函数来检查两个比较元素中是否有一个是特殊的,并在自定义sort函数中相应地返回结果:

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);

如果你愿意包括lodash,你可以用这个得到结果

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>

相关内容

最新更新