代码之家  ›  专栏  ›  技术社区  ›  user3142695

使用sort()移动数组开头的对象

  •  3
  • user3142695  · 技术社区  · 5 年前

    我需要按日期值对对象数组排序:

    array.sort(function(a,b){
    return new Date(b.date) - new Date(a.date);
    })
    

    但是如果 date 是未定义的,应该放在开头。上面显示了我的代码,空数据集将放在末尾。

    2 回复  |  直到 5 年前
        1
  •  4
  •   gman    5 年前

    const array = [
      { date: 624000, name: 'Eddison', },
      { date: 224000, name: 'Bobby', },
      {               name: '--no date 2' },
      { date: 924000, name: 'Fred', },
      { date: 124000, name: 'Abe', },
      {               name: '--no date 1' },
      { date: 424000, name: 'David', },
      { date: 324000, name: 'Catheryn', },
    ];
    
    // assuming there is no 0 date
    array.sort(function(a, b) {
      return (a.date && b.date)
          ? new Date(b.date) - new Date(a.date)
          : (a.date || 1) - (b.date || 1); 
    });
    
    //result
    array.forEach(elem => console.log(JSON.stringify(elem)));

    注意如果您关心0和未定义日期之间的差异,那么

      return (a.date !== undefined && b.date !== undefined)
    
        2
  •  -1
  •   Mister Jojo Łukasz Daniel Mastalerz    5 年前

    我更喜欢这个答案:这个代码是 在Chrome和FireFox上可以

    const array = 
          [ { date: 624000, name: 'Eddison'    } 
          , { date: 224000, name: 'Bobby'      } 
          , {               name: '--no date 2'} 
          , { date: 924000, name: 'Fred'       } 
          , { date: 124000, name: 'Abe'        } 
          , {               name: '--no date 1'} 
          , { date: 424000, name: 'David',     } 
          , { date: 324000, name: 'Catheryn'   } 
          ];
    
    array.sort((a,b)=> (a.date)?         // if (a.date !== undefined) 
                       (b.date)?         // if (b.date !== undefined) 
                       (new Date(b.date) -new Date(a.date))
                       :+1              // for b.date is undefined
                       :-1 )            // for a.date is undefined
    
    //result
    for (x of array) console.log(JSON.stringify(x));