繁体   English   中英

如何按两个属性对数组进行排序 - 按字母顺序排列,但最后是空值?

[英]How to sort array by two properties - alphabetically but null values at the end?

我有一个包含对象的数组。

这些对象具有fullname属性和member-id。

虽然fullname始终可用,但如果member-id是潜在成员但尚未注册,则member-id可以为null。

结果应如下所示:

{ id: 1122, name: Adrianna Budzinski }
{ id: 3785, name: Amy Divine }
{ id: 1555, name: Gale Purdue }
{ id: 1920, name: Rex Feng }
{ id: 2010, name: Samella Vizcaino }
{ id: null, name: Bethanie Weaver }
{ id: null, name: Celesta Gullo }
{ id: null, name: Darrick Fort }
{ id: null, name: Edmundo Boulanger }
{ id: null, name: Freddie Lanclos }
{ id: null, name: Gregory Lickteig }
{ id: null, name: Gwendolyn Cuadra }
{ id: null, name: Krystal Brosnahan }
{ id: null, name: Lahoma Pagani }
{ id: null, name: Senaida Risk }
{ id: null, name: Valarie Lopes }

具有id的成员应该在顶部按名称排序,而不应该遵循的成员也按名称排序。

到目前为止我所取得的是两个单独的排序函数,但我不知道如何合并它们。

let sortedFriends = friends.sort(function(a, b){
  if(a.name < b.name) return -1;
  if(a.name > b.name) return 1;
  return 0;
});

sortedFriends = sortedFriends.sort(function(a, b){
  if(a.id === null) return 1;
  if(b.id === null) return -1;
  if(a.id === b.id) return 0;
  if(a.id < b.id) return -1 ;
  if(a.id < b.id) return 1;
});

您可以按组( idnull )和名称使用排序。

 var array = [{ id: null, name: 'Darrick Fort' }, { id: null, name: 'Edmundo Boulanger' }, { id: 1122, name: 'Adrianna Budzinski' }, { id: null, name: 'Freddie Lanclos' }, { id: null, name: 'Gregory Lickteig' }, { id: null, name: 'Gwendolyn Cuadra' }, { id: 2010, name: 'Samella Vizcaino' }, { id: null, name: 'Bethanie Weaver' }, { id: null, name: 'Celesta Gullo' }, { id: 3785, name: 'Amy Divine' }, { id: null, name: 'Krystal Brosnahan' }, { id: null, name: 'Lahoma Pagani' }, { id: 1920, name: 'Rex Feng' }, { id: 1555, name: 'Gale Purdue' }, { id: null, name: 'Senaida Risk' }, { id: null, name: 'Valarie Lopes' }]; array.sort(function (a, b) { return (a.id === null) - (b.id === null) || a.name.localeCompare(b.name); }); console.log(array); 

您可以将它们组合如下

 var friends = [{ id: 1122, name: 'Adrianna Budzinski'}, { id: 3785, name: 'Amy Divine'}, { id: 1555, name: 'Gale Purdue'}, { id: 1920, name: 'Rex Feng'}, { id: 2010, name: 'Samella Vizcaino'}, { id: null, name: 'Bethanie Weaver'}, { id: null, name: 'Celesta Gullo'}, { id: null, name: 'Darrick Fort'}, { id: null, name: 'Edmundo Boulanger'}, { id: null, name: 'Freddie Lanclos'}, { id: null, name: 'Gregory Lickteig'}, { id: null, name: 'Gwendolyn Cuadra'}, { id: null, name: 'Krystal Brosnahan'}, { id: null, name: 'Lahoma Pagani'}, { id: null, name: 'Senaida Risk'}, { id: null, name: 'Valarie Lopes'}]; friends.sort(function(a, b) { // check id values are equal even the null if (a.id === b.id) { // compare the name property in that case if (a.name < b.name) return -1; if (a.name > b.name) return 1; return 0; } // else check for null if (a.id === null) return 1; if (b.id === null) return -1; // if both are different return the difference to sort based on that return a.id - b.id }); console.log(friends); 


或使用String#localeCompare()方法简化

 var friends = [{ id: 1122, name: 'Adrianna Budzinski'}, { id: 3785, name: 'Amy Divine'}, { id: 1555, name: 'Gale Purdue'}, { id: 1920, name: 'Rex Feng'}, { id: 2010, name: 'Samella Vizcaino'}, { id: null, name: 'Bethanie Weaver'}, { id: null, name: 'Celesta Gullo'}, { id: null, name: 'Darrick Fort'}, { id: null, name: 'Edmundo Boulanger'}, { id: null, name: 'Freddie Lanclos'}, { id: null, name: 'Gregory Lickteig'}, { id: null, name: 'Gwendolyn Cuadra'}, { id: null, name: 'Krystal Brosnahan'}, { id: null, name: 'Lahoma Pagani'}, { id: null, name: 'Senaida Risk'}, { id: null, name: 'Valarie Lopes'}]; friends.sort(function(a, b) { // if id's are equal compare name property // id of a is null then return 1 // id of b is null then return -1 // else return the difference of them return (a.id == b.id && a.name.localeCompare(b.name)) || (a.id === null && 1) || (b.id === null && -1) || (a.id - b.id); }); console.log(friends); 

您可以使用算术计算来确定位置:

逻辑:

  • 对于ID,因为我们只需要查看可用性,将其设置为1-1并进行比较。
  • 比较名称并相应地对其进行排序,然后添加ID比较值。
  • 根据优先级设置值。 因此,所有具有ID的成员都需要首先显示,因此具有更高的价值。

 var data=[{id:1122,name:"Adrianna Budzinski"},{id:3785,name:"Amy Divine"},{id:1555,name:"Gale Purdue"},{id:1920,name:"Rex Feng"},{id:2010,name:"Samella Vizcaino"},{id:null,name:"Bethanie Weaver"},{id:null,name:"Celesta Gullo"},{id:null,name:"Darrick Fort"},{id:null,name:"Edmundo Boulanger"},{id:null,name:"Freddie Lanclos"},{id:null,name:"Gregory Lickteig"},{id:null,name:"Gwendolyn Cuadra"},{id:null,name:"Krystal Brosnahan"},{id:null,name:"Lahoma Pagani"},{id:null,name:"Senaida Risk"},{id:null,name:"Valarie Lopes"}]; data.sort(function(a,b){ var _id1 = a.id? 1: -1; var _id2 = b.id? 1: -1; var rank = _id1 >_id2 ? -10: _id1< _id2 ? 10 : 0 var v = a.name > b.name? 1: a.name < b.name? -1: 0; return rank + v; }); document.getElementById("result").innerHTML = JSON.stringify(data,0,4) 
 <pre id="result"></pre> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM