使用多个键对数组对象进行排序:Javascript

尼克斯·贾恩

好吧,我有一个带有随机值的数组对象,例如。

var arr = [
    { id:1001, date:"20-02-2014", Name: 'demo1' },
    { id:1004, date:"13-02-2014", Name: 'demo0' },
    { id:1000, date:"10-02-2014", Name: 'demo14' },
    { id:1004, date:"16-02-2014", Name: 'demo10' },
    { id:1006, date:"22-02-2014", Name: 'demo111' },
    { id:1003, date:"28-02-2014", Name: 'demo16' },
    { id:1000, date:"28-01-2014", Name: 'demo12' },
    { id:1004, date:"28-01-2014", Name: 'demo01' },
    { id:1000, date:"08-01-2014", Name: 'demo41' },
    { id:1006, date:"08-01-2014", Name: 'demo91' }
]

我想先按键id,然后按键对这个数组进行排序date

输出:

sorted_arr = [
 {"id":1000,"date":"08-01-2014","Name":"demo41"}, //group1
 {"id":1000,"date":"28-01-2014","Name":"demo12"}, //group1
 {"id":1000,"date":"10-02-2014","Name":"demo14"}, //group1 
 {"id":1001,"date":"20-02-2014","Name":"demo1"},  //group2
 {"id":1003,"date":"28-02-2014","Name":"demo16"}, //group3
 {"id":1004,"date":"28-01-2014","Name":"demo01"}, //group4
 {"id":1004,"date":"13-02-2014","Name":"demo0"},  //group4
 {"id":1004,"date":"16-02-2014","Name":"demo10"}, //group4
 {"id":1006,"date":"08-01-2014","Name":"demo91"}  //group5
 {"id":1006,"date":"22-02-2014","Name":"demo111"} //group5
]

我尝试了一些通用代码进行排序,

    // generic comparison function
    cmp = function(x, y){
      return x > y ? 1 : x < y ? -1 : 0; 
    };


    arr.sort(function(a, b){
       return cmp( 
          [cmp(a.id, b.id), cmp(a.date, b.date)], 
          [cmp(b.id, a.id), cmp(b.date, a.date)]
       );
    });

我提到几个示例SO实施例,但没有得到预期的输出。请建议我最好的方法来做到这一点。

Xotic750

无需创建Date对象,只需将日期字符串重新排序为可排序的字符串,例如

本示例假定您的日期格式相同,DD-MM-YYYYYYYYMMDD为日期排序创建日期。

Java脚本

var arr = [
    { id:1001, date:"20-02-2014", Name: 'demo1' },
    { id:1004, date:"13-02-2014", Name: 'demo0' },
    { id:1000, date:"10-02-2014", Name: 'demo14' },
    { id:1004, date:"16-02-2014", Name: 'demo10' },
    { id:1006, date:"22-02-2014", Name: 'demo111' },
    { id:1003, date:"28-02-2014", Name: 'demo16' },
    { id:1000, date:"28-01-2014", Name: 'demo12' },
    { id:1004, date:"28-01-2014", Name: 'demo01' },
    { id:1000, date:"08-01-2014", Name: 'demo41' },
    { id:1006, date:"08-01-2014", Name: 'demo91' }
];

var sorted = arr.sort(function (a, b) {
    return a.id - b.id || a.date.split('-').reverse().join('') - b.date.split('-').reverse().join('');
});

sorted.forEach(function (element) {
    console.log(JSON.stringify(element));
});

输出量

{“ id”:1000,“ date”:“ 08-01-2014”,“ Name”:“ demo41”}
{“ id”:1000,“ date”:“ 28-01-2014”,“ Name”:“ demo12”}
{“ id”:1000,“ date”:“ 10-02-2014”,“ Name”:“ demo14”}
{“ id”:1001,“日期”:“ 20-02-2014”,“名称”:“ demo1”} 
{“ id”:1003,“ date”:“ 28-02-2014”,“ Name”:“ demo16”} 
{“ id”:1004,“ date”:“ 28-01-2014”,“ Name”:“ demo01”} 
{“ id”:1004,“ date”:“ 13-02-2014”,“ Name”:“ demo0”}
{“ id”:1004,“ date”:“ 16-02-2014”,“ Name”:“ demo10”}
{“ id”:1006,“ date”:“ 08-01-2014”,“ Name”:“ demo91”} 
{“ id”:1006,“ date”:“ 22-02-2014”,“ Name”:“ demo111”} 

jsFiddle上

如果担心混合日期格式(如@xdazz所述),则可以通过自己检查填充来改善此格式。当按日期排序时,以下将创建格式“ YYYYYYMMDD”。在此示例中,不需要额外的年份填充,因为我采用的是数值的数字差异,但是如果您选择比较字符串,那么这很重要。

function pad(s, n) {
    var v = '',
        i;

    for(i = 0; i < n - s.length; i += 1) {
        v += '0';
    }

    return v + s;
}

var sorted = arr.sort(function (a, b) {
    var idDiff = a.id - b.id;

    if (idDiff) {
        return idDiff;
    }

    var ordA = a.date.split('-').reverse(),
        ordB = b.date.split('-').reverse();

    ordA[0] = pad(ordA[0], 6);
    ordA[1] = pad(ordA[1], 2);
    ordA[2] = pad(ordA[2], 2);
    ordA = ordA.join('');
    ordB[0] = pad(ordB[0], 6);
    ordB[1] = pad(ordB[1], 2);
    ordB[2] = pad(ordB[2], 2);
    ordB = ordB.join('');
    return ordA - ordB;
});

jsFiddle上

如果您真的想使用Date对象,我建议以下内容。

var sorted = arr.sort(function (a, b) {
    var idDiff = a.id - b.id;

    if (idDiff) {
        return idDiff;
    }

    var ordA = a.date.split('-').reverse(),
        ordB = b.date.split('-').reverse();

    ordA[1] -= 1;
    ordB[1] -= 1;

    return new Date(Date.UTC.apply(undefined, ordA)).valueOf() -  new Date(Date.UTC.apply(undefined, ordB)).valueOf();
});

sorted.forEach(function (element) {
    console.log(JSON.stringify(element));
});

jsFiddle上

注意:这些示例不处理负年份的日期,同样,您将需要进行进一步的修改。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何同时使用多个键对对象数组进行排序?

来自分类Dev

使用不同的键对多个数组对象进行排序

来自分类Dev

在javascript中按字母顺序对数组及其对象键进行排序

来自分类Dev

使用javascript对数组表进行排序

来自分类Dev

使用元素内部的多个键对数组元素进行排序-PHP

来自分类Dev

使用多个键和Date简易方法对数组进行排序

来自分类Dev

使用通用键对数组内的数组进行排序

来自分类Dev

使用NSSortDescriptor对数组进行排序而不使用任何键?

来自分类Dev

使用其他数组对数组对象进行排序

来自分类Dev

Javascript-按多个条件对数组进行排序

来自分类Dev

用Javascript对数组,变量或对象进行排序

来自分类Dev

如何使用正则表达式对数组中的Javascript对象进行排序

来自分类Dev

在PHP中使用多个条件对数组进行排序

来自分类Dev

基于多个值对数组进行排序

来自分类Dev

如何使用AngularJs或Javascript对数组进行排序?

来自分类Dev

如何使用javascript按组对数组进行排序?

来自分类Dev

使用混合类型值对数组进行JavaScript排序

来自分类Dev

使用javascript中的sort方法对数组进行排序

来自分类Dev

JavaScript 使用 splice() 对数组进行排序导致 NaN

来自分类Dev

使用javascript对数组进行数字排序

来自分类Dev

从 AZ 对数组内的对象进行排序

来自分类Dev

使用 JavaScript 对对象数组进行排序

来自分类Dev

按不同的键对javascript数组对象进行排序

来自分类Dev

用Javascript对键上的对象进行排序的数组

来自分类Dev

JavaScript与PHP对数组进行排序

来自分类Dev

在JavaScript上对数组元素进行排序

来自分类Dev

用JavaScript对数组进行排序

来自分类Dev

Javascript - 在初始“-”之后对数组进行排序

来自分类Dev

根据一个属性和日期对象的值对数组进行排序,以使用javascript获取最新条目

Related 相关文章

  1. 1

    如何同时使用多个键对对象数组进行排序?

  2. 2

    使用不同的键对多个数组对象进行排序

  3. 3

    在javascript中按字母顺序对数组及其对象键进行排序

  4. 4

    使用javascript对数组表进行排序

  5. 5

    使用元素内部的多个键对数组元素进行排序-PHP

  6. 6

    使用多个键和Date简易方法对数组进行排序

  7. 7

    使用通用键对数组内的数组进行排序

  8. 8

    使用NSSortDescriptor对数组进行排序而不使用任何键?

  9. 9

    使用其他数组对数组对象进行排序

  10. 10

    Javascript-按多个条件对数组进行排序

  11. 11

    用Javascript对数组,变量或对象进行排序

  12. 12

    如何使用正则表达式对数组中的Javascript对象进行排序

  13. 13

    在PHP中使用多个条件对数组进行排序

  14. 14

    基于多个值对数组进行排序

  15. 15

    如何使用AngularJs或Javascript对数组进行排序?

  16. 16

    如何使用javascript按组对数组进行排序?

  17. 17

    使用混合类型值对数组进行JavaScript排序

  18. 18

    使用javascript中的sort方法对数组进行排序

  19. 19

    JavaScript 使用 splice() 对数组进行排序导致 NaN

  20. 20

    使用javascript对数组进行数字排序

  21. 21

    从 AZ 对数组内的对象进行排序

  22. 22

    使用 JavaScript 对对象数组进行排序

  23. 23

    按不同的键对javascript数组对象进行排序

  24. 24

    用Javascript对键上的对象进行排序的数组

  25. 25

    JavaScript与PHP对数组进行排序

  26. 26

    在JavaScript上对数组元素进行排序

  27. 27

    用JavaScript对数组进行排序

  28. 28

    Javascript - 在初始“-”之后对数组进行排序

  29. 29

    根据一个属性和日期对象的值对数组进行排序,以使用javascript获取最新条目

热门标签

归档