【问题标题】:How to sort array by two properties - alphabetically but null values at the end?如何按两个属性对数组进行排序 - 按字母顺序但最后为空值?
【发布时间】:2016-06-09 11:00:05
【问题描述】:

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

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

虽然全名始终可用,但如果他或她是潜在成员但尚未注册,则成员 ID 可以为空。

结果应如下所示:

{ 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 的成员应该按名称排序在顶部,没有 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;
});

【问题讨论】:

  • 只需将它们一个接一个地粘贴在同一个函数中。如果函数第一部分的结果为0,则运行第二部分,否则返回结果。

标签: javascript arrays sorting


【解决方案1】:

您可以使用按组(id 或 null)和名称排序。

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

【讨论】:

【解决方案2】:

你可以像下面这样组合它们

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

【讨论】:

    【解决方案3】:

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

    逻辑:

    • 对于 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)
    &lt;pre id="result"&gt;&lt;/pre&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多