TS 2个数组,如果第一个数组中的元素存在于第二个数组中,则将其附加到第二个数组的开头。

3

我有两个对象列表。

一个是“所有”对象列表,另一个是“特殊”对象列表。

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

如何对“所有”对象的列表进行排序,以按照以下顺序排列对象:首先是“特殊”对象,然后是其他所有对象?

每个对象都有一个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"}
]
2个回答

3

你可以使用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);


2
我还要补充一点,.sort() 方法是以可变的方式实现的,并且会更改原始数组。因此,在使用 .slice() 之前,您可能需要像这样使用它:let sorted = all.slice().sort(sortFunc); - Danila

0
如果您愿意使用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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接