2017-04-26 41 views
-1

我想按三个值排序此JavaScript数组,但我似乎无法弄清楚如何一次对多个属性进行排序。按3个值对JavaScript数组进行排序

的要求是:

  1. featured项目应该是在最高层
  2. 然后项目进行没有名(null
  3. 然后用姓名的项目是featured
  4. createdAt降序排序(从最新的优先排序)

这是数组:

var items [ 
    { name: 'foo-1', featured: true, createdAt: 1493000001 }, 
    { name: null, featured: false, createdAt: 1493000003 }, 
    { name: 'foo-3', featured: true, createdAt: 1493000002 }, 
    { name: 'foo-4', featured: false, createdAt: 1493000004 }, 
    { name: 'foo-5', featured: false, createdAt: 1493000005 }, 
]; 

结果应该是:

[ 
    { name: 'foo-3', featured: true, createdAt: 1493000002 }, 
    { name: 'foo-1', featured: true, createdAt: 1493000001 }, 
    { name: null, featured: false, createdAt: 1493000003 }, 
    { name: 'foo-5', featured: false, createdAt: 1493000005 }, 
    { name: 'foo-4', featured: false, createdAt: 1493000004 }, 
] 
+3

已经回答[如何排序多个字段对象数组?](HTTP的=> http://stackoverflow.com/a/4760279/1315419 – Vasan

+4

可能重复:/ /stackoverflow.com/questions/6913512/how-to-sort-an-array-of-objects-by-multiple-fields) –

+0

@Vasan是的,这个答案真的很好 - http://stackoverflow.com/a/ 4760279/2957677 –

回答

2

var items = [ 
 
    { name: 'foo-1', featured: true, createdAt: 1493000001 }, 
 
    { name: null, featured: false, createdAt: 1493000003 }, 
 
    { name: 'foo-3', featured: true, createdAt: 1493000002 }, 
 
    { name: 'foo-4', featured: false, createdAt: 1493000004 }, 
 
    { name: 'foo-5', featured: false, createdAt: 1493000005 }, 
 
]; 
 

 
items.sort(function(a, b) { 
 
    if(a.featured && !b.featured) return -1; // if a is featured and b is not, then put a above b 
 
    if(!a.featured && b.featured) return 1; // if b is featured and a is not, then put b above a 
 
    
 
    if(!a.name && b.name) return -1;   // if a doesn't have a name and b does, then put a above b 
 
    if(a.name && !b.name) return 1;   // if b doesn't have a name and a does, then put b above a 
 
    
 
    return b.createdAt - a.createdAt;  // otherwise (a and b have simillar properties), then sort by createdAt descendently 
 
}); 
 

 
console.log(items);

1

你可以使用一个比较,可以作为参数传递给sort()函数传递功能 - 有关更多详细信息,请参阅Array.prototype.sort()。你的情况比较函数可能看起来像这样:

var items = [ 
    { name: 'foo-1', featured: true, createdAt: 1493000001 }, 
    { name: null, featured: false, createdAt: 1493000003 }, 
    { name: 'foo-3', featured: true, createdAt: 1493000002 }, 
    { name: 'foo-4', featured: false, createdAt: 1493000004 }, 
    { name: 'foo-5', featured: false, createdAt: 1493000005 }, 
]; 

function compare(a, b) { 
    if (a.featured === true && b.featured === false) return -1; 
    if (a.featured === false && b.featured === true) return 1; 
    if (a.name === null && b.featured !== null) return -1; 
    if (a.name !== null && b.name === null) return 1; 

    return b.createdAt - a.createdAt; 
}; 

items.sort(compare); 

应该覆盖情况下,当是一个空字符串。

相关问题